我如何在 ExcelJS 中使用承诺

How do I use promises in ExcelJS

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

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

这就是 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

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

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

eachRow returns undefined,return 承诺是没有意义的,因为它本质上是同步的。

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

假设您要调用一个方法db.insert(row),return是一个承诺,那么每行将有一个承诺。如果您将这些承诺收集到一个数组中,那么您可以执行标准 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 没有 return 承诺,但使用回调参数,那么 promisify 相关方法优先。