为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

犯罪嫌疑人X 2022-07-08 18:00:26
我的代码看起来像这样:(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}我以为这段代码会执行计算等待每条结果被预处理并保存到文件中然后退出第一步有效,因为程序似乎在等待繁重的计算结果。但是,似乎 finally 子句是在 forEach 循环中的承诺解决之前输入的,导致程序提前退出。我究竟做错了什么?
查看完整描述

2 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

你在这里有两个问题:

  1. 您的forEach循环saveResultsToFiles不会返回任何内容,因此您无法让代码的其他部分“等待”每个项目的承诺解决。

  2. saveResultFile返回一个承诺,但这个承诺不在await你的try块中。

这两个问题的结果是该块仅“开始”保存到文件的过程,但在屈服于该块try之前不等待它完成。finally

以下是您可以尝试的解决方案。

  1. 您需要能够进行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));

}


查看完整回答
反对 回复 2022-07-08
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

你没有在等待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

}


查看完整回答
反对 回复 2022-07-08
  • 2 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信