我如何在 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 相关方法优先。
我有一个接收 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 相关方法优先。