【问题标题】:How do I use promises in ExcelJS如何在 ExcelJS 中使用 Promise
【发布时间】:2019-03-04 10:21:28
【问题描述】:

我有一个接收 xlsx 文件的节点 api。它从该文件中提取记录并将它们写入数据库。

在某些情况下,由于缺少相关数据,数据不会写入数据库。我想在将结果返回给用户之前捕获所有这些错误,因此我需要使用 Promise。

the docs show worksheet.eachRow 应该是这样工作的

worksheet.eachRow(function(row, rowNumber) {
    console.log('Row ' + rowNumber + ' = ' + JSON.stringify(row.values));
});

文档还说 exceljs 内置了节点承诺excelJS Promises,但以下代码不起作用

worksheet.eachRow(function(row, rowNumber) {
        console.log('Row ' + rowNumber + ' = ' + JSON.stringify(row.values));
}).then((result)=>{
  console.log("Done")
})

我收到错误Cannot read property 'then' of undefined

【问题讨论】:

    标签: node.js promise exceljs


    【解决方案1】:

    exceljs 确实支持 Promise,但这仅适用于异步任务,例如文件 I/O。

    对工作表中的行进行迭代同步,这意味着对每一行立即执行对eachRow 的回调函数,并且只有在执行这些回调之后才会对eachRow 的调用完成。

    eachRow 返回undefined,让它返回一个承诺是没有意义的,因为它本质上是同步的。

    现在,如果您计划为每一行执行一个异步任务,例如向数据库中插入一些东西,情况就不同了。

    假设您要调用一个返回承诺的方法db.insert(row),那么每行将有一个承诺。如果您将这些承诺收集到一个数组中,那么您可以执行标准的Promise.all 调用来获得整体承诺的结果:

    const promises = [];
    worksheet.eachRow(function(row, rowNumber) {
        console.log('Row ' + rowNumber + ' = ' + JSON.stringify(row.values));
        const promise = db.insert(row); // <-- whatever async operation you have here
        promises.push(promise);
    });
    
    Promise.all(promises).then((result)=>{
        console.log("Done")
    }).catch((err) => {
        console.log("An error occurred while inserting data", err);
    });
    

    如果您的数据库 API 不返回 Promise,而是使用回调参数,则首先使用 promisify 相关方法。

    【讨论】:

    • 谢谢。你的解释是有道理的,我只是希望 exceljs 文档给出了这个解释。除此之外,它非常彻底,但正是这种高级知识,除了库的最基本用法之外,其他任何事情都需要它。
    • 很高兴听到它有用!
    猜你喜欢
    • 2022-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 2015-10-01
    • 2020-09-04
    相关资源
    最近更新 更多