等待回调函数

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

我相信这正是您要找的,它将运行您的记录并行导入,同时保持输出顺序。