You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:45:00