如何解决js函数参数通过魔术传递
我发现了一个javascript代码(我更新了),但是其中一部分代码没有得到:/ (完整的源代码在这里:https://github.com/a-h/ddbimport/tree/working/01-nodeimport)
我不知道的部分代码:
const batchOf = (size = 25,execute) => {
const items = [];
return async (item,last = false) => {
if (item) {
items.push(item);
}
if (last || items.length === size) {
await execute(items);
items.length = 0;
}
};
};
首先,我不知道最后一项可能是真实的吗?我在CSV文件中尝试了5行,但是它从不执行部分...
第二,javascript在哪里获取item
本身的值?我的意思是我们通常需要声明item
或将其传递给函数的参数。因为如果我尝试拆分异步函数本身时,需要将参数item
传递给我的函数。
例如:
const batchOf = (size = 25,execute) => {
const items = [];
async function passItem (item,last = false) {
if (item) {
items.push(item);
}
if (last || items.length === size) {
await execute(items);
items.length = 0;
}
};
return passItem(?,? ); // i should pass some parameters here..
};
因此,如果有人可以通过last
项目帮助我解决问题,并向我解释javascript的神奇之处,因为我对此一无所知。
感谢您的帮助。
解决方法
函数是javascript中的一等公民,这意味着它们可以像常规变量一样存储,作为参数传递或从函数中返回。以下是来自mozilla的详细概述:https://developer.mozilla.org/en-US/docs/Glossary/First-class_Function
要直接回答您的问题,'batchOf'函数不会在return语句中执行异步函数。当开发人员执行batchOf函数时,他们取回该内部函数,稍后将调用它们。在这种情况下,他们创建了处理器:
const processor = batchOf(25,async (items) => {
const dynamoItems = toDynamoItems(converters,items);
await batchWrite({ client,table,dynamoItems });
count += items.length;
if (count % 2500 == 0) {
const seconds = since(start);
const itemsPerSecond = count / seconds;
console.log(
`Inserted ${count} records in ${seconds}s - ${itemsPerSecond} records per second`
);
}
});
他们将想要第二条if语句执行的操作传递给batchOf函数的详细信息,并返回一个新函数,在读取文件时调用它们:
let rowIndex = 0;
const parser = fastCsv
.parseFile(fileName,{ headers: true,delimiter })
.on("error",(error) => console.error(error))
.on("data",async (row) => {
parser.pause();
try {
await processor(row);
rowIndex++;
} catch (err) {
console.log(`Error processing row ${rowIndex}: ${err}`);
} finally {
parser.resume();
}
})
.on("end",async (rowCount) => {
await batch(null,true);
console.log(`Parsed ${rowCount} rows`);
});
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。