JavaScript中for循环如何等待异步函数执行完成后正确获取返回值
问题原因
- 首先,
getPDF函数内部未等待pdf(dataBuffer)这个异步操作完成就结束执行:你调用pdf()后通过.then()处理结果,但既没有对这个Promise添加await,也没有把该Promise作为getPDF的返回值,导致async类型的getPDF不等解析逻辑执行完,就提前返回了状态为fulfilled的Promise,默认值为undefined。 - 其次,你写的
return(resultsArray)是.then()回调函数的返回值,而非外层getPDF函数的返回值,外部调用自然拿不到解析结果。 - 额外注意:当前逻辑中解析用的是已经读到内存的buffer,删除临时文件的操作不会影响解析结果,但如果后续调整涉及磁盘IO,这类异步操作顺序问题很容易引发bug。
修复方案
推荐把混合的.then()写法统一替换为async/await,逻辑更清晰不易出错,修改后的getPDF代码如下:
async function getPDF(query, siteName, templateUrl, charToReplace) { const currentWeek = currentWeekNumber().toString(); await downloadPDF(templateUrl.replace(charToReplace, currentWeek), "temp/pdf.pdf"); const resultsArray = [] const dataBuffer = fs.readFileSync("temp/pdf.pdf"); // 等待pdf异步解析完成,直接拿到结果 const data = await pdf(dataBuffer); const pdfContent = data.text; const splittedArray = pdfContent.split("\n"); // 直接遍历匹配结果,删掉冗余的map+filter逻辑 splittedArray.forEach((item, index) => { if(item.includes(query)) { resultsArray.push({ result: item, caseId: splittedArray[index-1].split(',', 1)[0], site: siteName }); } }); // 解析完成后再删除临时文件,逻辑更严谨 fs.unlinkSync("temp/pdf.pdf"); // 显式返回整理好的结果数组 return resultsArray; }
getData 函数的for of+await串行调用逻辑没有问题,不需要修改。
内容的提问来源于stack exchange,提问作者Leomania
相关产品推荐
相关产品推荐

