【问题标题】:await for function with callback等待带有回调的函数
【发布时间】:2017-06-09 20:58:10
【问题描述】:

我正在使用流和异步/等待功能。到目前为止我所拥有的是:

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));
});

这样做的正确方法是什么?

【问题讨论】:

  • 这里提供asyncawait函数的是什么?

标签: javascript ecmascript-2017


【解决方案1】:

比这稍微复杂一些 - node.js 流不适应(至少现在还没有)到 es7 async/await 方法。

如果您想自行开发,请考虑编写一个派生自 Readable stream 的类。实现基于 Promise 的接口是一项艰巨的任务,但它是可能的。

如果您对使用许可的许可框架感到满意,请查看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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2019-05-28
    • 2017-03-31
    • 1970-01-01
    相关资源
    最近更新 更多