猿问

在等待 try 块中的承诺解决之前调用 finally 块

我的代码看起来像这样:


(async () => {

  try {

    const results = await heavyCalculation();

    saveResultsToFiles(results);

  } catch (e) {

    handleError(e);

  } finally {

    process.exit(0);

  }

})();


const saveResultsToFiles = (results) => {

  results.forEach(result => {

    (async () => await saveResultFile(result));

  })

}


const saveResultFile = (result) => {

  return promiseToPreprocess(result)

    .then(processedResult => saveToFile(processedResult))

}


const promiseToPreprocess = async (result) => {

  // this function returns a promise to preprocess the data

}


const saveToFile = (data) => {

  // this function synchronously saves data to a file

}

我以为这段代码会

  1. 执行计算

  2. 等待每条结果被预处理并保存到文件中

  3. 然后退出

第一步有效,因为程序似乎在等待繁重的计算结果。但是,似乎 finally 子句是在 forEach 循环中的承诺解决之前输入的,导致程序提前退出。我究竟做错了什么?


犯罪嫌疑人X
浏览 105回答 2
2回答

幕布斯6054654

你在这里有两个问题:您的forEach循环saveResultsToFiles不会返回任何内容,因此您无法让代码的其他部分“等待”每个项目的承诺解决。saveResultFile返回一个承诺,但这个承诺不在await你的try块中。这两个问题的结果是该块仅“开始”保存到文件的过程,但在屈服于该块try之前不等待它完成。finally以下是您可以尝试的解决方案。您需要能够进行await每个saveResultFile调用,为此您需要访问在saveResultsToFiles. 实际上,.map您将获得一系列结果(而不是.forEach):const saveResultsToFiles = (results) => {  return results.map(result => saveResultFile(result));}现在它saveResultsToFiles实际上返回了一组承诺,你应该await在继续之前将它们全部返回。这正是Promise.all为了:try {    const results = await heavyCalculation();    await Promise.all(saveResultsToFiles(results));}

慕虎7371278

你没有在等待saveResultsToFiles(results);尝试:(async () => {  try {    const results = await heavyCalculation();    saveResultsToFiles(results);  } catch (e) {    handleError(e);  } finally {    process.exit(0);  }})();const saveResultsToFiles = async (results) => {  results.forEach(result => {    await saveResultFile(result);  })}const saveResultFile = (result) => {  return promiseToPreprocess(result)    .then(processedResult => saveToFile(processedResult))}const promiseToPreprocess = async (result) => {  // this function returns a promise to preprocess the data}const saveToFile = (data) => {  // this function synchronously saves data to a file}
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答