等待回调函数
await for function with callback
我正在玩流和 async/await 功能。我到目前为止是:
let logRecord = ((record, callback) => {
console.log(record);
return callback();
});
let importCSVfromPath = async((csv_path) => {
return new Promise(function(resolve, reject) {
var parser = parse();
var input = fs.createReadStream(csv_path);
var transformer = transform(logRecord, {parallel: 1});
input.on('error', (err) => {
reject(err);
});
input.on('finish', ()=> {
resolve();
});
input.pipe(parser).pipe(transformer);
});
});
现在我想用 importRecord 替换 logRecord。问题是这个函数必须使用已经是异步堆栈一部分的函数。
let importRecord = async( (record) => {
.......
await(insertRow(row));
});
正确的做法是什么?
它比这稍微复杂一些 - node.js 流不适合(至少现在还不适合)es7 async
/await
方法。
如果您想自己开发它,请考虑编写一个从 Readable stream 派生的 class。实现基于承诺的接口是一项艰巨的任务,但这是可能的。
如果您不介意使用宽松的许可框架 - 请查看 Scramjet。有了它,您的代码将如下所示(大部分示例都是解析 CSV - 我将在下一个版本中添加一个帮助程序):
fs.createReadStream("file.csv") // open your file
.pipe(new StringStream()) // pass to scramjet
.split("\n") // split by line
.parse((line) => line.split(",")) // convert lines to arrays
.map(async (line) => { // run asynchrounous mapping
await importRecord(line); // import log to DB
return logRecord(line); // return some log for the output
})
.pipe(process.stdout); // pipe the output wherever you like
我相信这正是您要找的,它将运行您的记录并行导入,同时保持输出顺序。
我正在玩流和 async/await 功能。我到目前为止是:
let logRecord = ((record, callback) => {
console.log(record);
return callback();
});
let importCSVfromPath = async((csv_path) => {
return new Promise(function(resolve, reject) {
var parser = parse();
var input = fs.createReadStream(csv_path);
var transformer = transform(logRecord, {parallel: 1});
input.on('error', (err) => {
reject(err);
});
input.on('finish', ()=> {
resolve();
});
input.pipe(parser).pipe(transformer);
});
});
现在我想用 importRecord 替换 logRecord。问题是这个函数必须使用已经是异步堆栈一部分的函数。
let importRecord = async( (record) => {
.......
await(insertRow(row));
});
正确的做法是什么?
它比这稍微复杂一些 - node.js 流不适合(至少现在还不适合)es7 async
/await
方法。
如果您想自己开发它,请考虑编写一个从 Readable stream 派生的 class。实现基于承诺的接口是一项艰巨的任务,但这是可能的。
如果您不介意使用宽松的许可框架 - 请查看 Scramjet。有了它,您的代码将如下所示(大部分示例都是解析 CSV - 我将在下一个版本中添加一个帮助程序):
fs.createReadStream("file.csv") // open your file
.pipe(new StringStream()) // pass to scramjet
.split("\n") // split by line
.parse((line) => line.split(",")) // convert lines to arrays
.map(async (line) => { // run asynchrounous mapping
await importRecord(line); // import log to DB
return logRecord(line); // return some log for the output
})
.pipe(process.stdout); // pipe the output wherever you like
我相信这正是您要找的,它将运行您的记录并行导入,同时保持输出顺序。