【发布时间】:2022-09-24 16:08:02
【问题描述】:
因此,我一直在与我的 Nodejs 应用程序进行斗争,以找出如何可靠地构建一系列 Promise。我已经阅读了多个重复的问题,但我似乎无法弄清楚为什么在我的情况下它会出错。我意识到我的变量范围存在问题。
const fs = require(\'fs\');
const util = require(\'util\');
module.exports = async function (worksheet) {
var promises = [];
worksheet.eachRow(async function (row, rowNum) {
if( //some condition met ) {
// stuff gets done -------
const writeFilePromisified = util.promisify(fs.writeFile);
const doSomethingAsync = async () => {
await writeFilePromisified(`file.pdf`, pdfBytes);
console.log(\'file write done with promisified writeFile\');
}
let pro = doSomethingAsync();
promises.push(pro);
}
}
Promise.all(promises).then(values => {
console.log(\"Done\");
});
}
据我了解,这应该等待所有承诺得到解决,然后记录“完成”。
但这只是不等待承诺并立即看到undefined 并记录Done。
所以任何人都可以帮我弄清楚为什么会这样?因为如果我在worksheet.eachRow 函数中记录promises,我可以看到所有pending promises。但是当我离开那个功能的那一刻,一切都消失了。
来自@hellikiam 的答案的解决方案:
const fs = require(\'fs\');
const util = require(\'util\');
const rows = reportWS.getRows(contentStart, reportWS.rowCount); // check and verify row count for your excelsheet
module.exports = async function (worksheet) {
var promises = rows.map(async function (row, index) {
try{
if( //some condition met ) {
// stuff gets done -------
const writeFilePromisified = util.promisify(fs.writeFile);
const doSomethingAsync = async () => {
await writeFilePromisified(`file.pdf`, pdfBytes);
return await res;
}
let pro = doSomethingAsync();
return pro;
}
} catch (e => throw e);
}
await Promise.all(promises)
console.log(\"Done\");
}
他的回答是承诺反模式,因为我们已经在异步函数中,我们可以返回一个值,它会自动返回一个承诺。
标签: javascript node.js promise exceljs