如何在ExcelJS中使用Promise

时间:2019-03-04 10:21:29

标签: node.js promise exceljs

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

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

这是the docs show工作表.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

1 个答案:

答案 0 :(得分:1)

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

工作表中的行迭代是同步完成,这意味着将eachRow的回调函数立即针对每一行执行,并且只有在执行了这些回调之后,{{1 }}完成。

eachRow返回eachRow,并且使它返回承诺是没有意义的,因为它本质上是同步的。

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

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

Promise.all

如果您的数据库API不返回promise,但使用了回调参数,则首先promisify有关的方法。