Javascript 最后,在等待try块中的承诺解析之前调用块

Javascript 最后,在等待try块中的承诺解析之前调用块,javascript,promise,Javascript,Promise,我的代码如下所示: (异步()=>{ 试一试{ const results=等待重计算(); 保存结果文件(结果); }捕获(e){ handleError(e); }最后{ 进程退出(0); } })(); const saveResultsToFiles=(结果)=>{ results.forEach(result=>{ (async()=>await saveResultFile(result)); }) } const saveResultFile=(结果)=>{ 返回承诺重新处理(结果

我的代码如下所示:

(异步()=>{
试一试{
const results=等待重计算();
保存结果文件(结果);
}捕获(e){
handleError(e);
}最后{
进程退出(0);
}
})();
const saveResultsToFiles=(结果)=>{
results.forEach(result=>{
(async()=>await saveResultFile(result));
})
}
const saveResultFile=(结果)=>{
返回承诺重新处理(结果)
.then(processedResult=>saveToFile(processedResult))
}
const promiseToPreprocess=异步(结果)=>{
//此函数返回预处理数据的承诺
}
常量保存文件=(数据)=>{
//此函数用于将数据同步保存到文件中
}
我以为这个代码会

  • 计算
  • 等待每个结果片段被预处理并保存到文件中
  • 然后退出

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

    这里有两个问题:

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

  • saveResultFile
    返回一个承诺,但此承诺未在
    try
    块中
    wait
    ed

  • 这两个问题的结果是,
    try
    块仅“启动”保存到文件的过程,而不是等到它完成后才转到
    finally

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

  • 您需要能够
    等待
    每个
    saveResultFile
    调用,为此,您需要访问
    saveResultsToFiles
    中实例化的承诺数组。使用
    .map
    您将实际获得一系列结果(与
    .forEach
    相反):
  • 既然
    saveResultsToFiles
    实际上返回了一个承诺数组,那么您应该
    在继续之前等待所有承诺。这正是
    承诺的内容。所有的
    都是为了:

  • 您没有等待
    saveResultsToFiles(结果)

    尝试:


    .forEach()
    async
    函数一无所知。函数返回承诺,但
    .forEach()
    始终忽略返回值。“SyntaxError:await仅在异步函数和异步生成器中有效”完美,我没有意识到是forEach函数导致了问题。作为对您的解决方案的一个小小调整,我使用了
    returnpromise.all(results.map(…
    然后简单地
    等待saveResultsToFiles
    ,因为返回一个承诺比返回一个承诺数组更符合逻辑。因此它似乎不完全起作用。最后一个块仍然在
    之前调用。然后
    saveResultFile
    函数意味着该文件没有实际保存。我如何强制执行在转到finally块之前,等待的承诺以及then子句?对于要调用的
    .then
    ,我需要将
    中的函数映射到
    异步结果=>等待saveResultFile(结果)
    ,虽然我不明白为什么。@ToivoSäwén你确定
    saveToFile
    会返回一个承诺吗?啊,就是这样。它没有。
    const saveResultsToFiles = (results) => {
      return results.map(result => saveResultFile(result));
    }
    
    try {
        const results = await heavyCalculation();
        await Promise.all(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
    }