我有一个接收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
答案 0 :(得分:1)
Exceljs支持Promise是事实,但这仅适用于异步任务,例如文件I / O。
工作表中的行迭代是同步完成,这意味着将eachRow
的回调函数立即针对每一行执行,并且只有在执行了这些回调之后,{{1 }}完成。
eachRow
返回eachRow
,并且使它返回承诺是没有意义的,因为它本质上是同步的。
现在,如果您计划为每一行执行一个异步任务,例如向数据库中插入一些内容,情况就变得不同了。
假设您要调用返回承诺的方法undefined
,那么每行将有一个承诺。如果将这些诺言收集到一个数组中,则可以执行标准的db.insert(row)
调用以获取总体诺言结果:
Promise.all
如果您的数据库API不返回promise,但使用了回调参数,则首先promisify有关的方法。