首页 > 解决方案 > 在函数中使用多个等待,循环和处理错误

问题描述

我正在努力解决这个问题。我已经搜索过类似的问题。

基本上,我有 2 个异步函数。出于这个问题的目的,我们称它们为 getData() 和 processData(),它们都返回一个 Promise。(这两个函数没有使用 async 关键字定义)

然后我有一个使用 async 关键字调用这两个函数的函数。像这样:

async function init() {
    // get the data
    for (var i = 0; i < arr_process.length; i++) {
        try {
            await getData(arr_process[i]);
        } catch (err) {
            return Promise.reject(err);
        }
    }

    // now process the data
    for (var i = 0; i < arr_done.length; i++) {
        try {
            await processData(arr_done[i]);
        } catch (err) {
            return Promise.reject(err);
        }
    }
}

我的问题是;这是处理承诺拒绝的正确方法吗?我的理解是,一旦您使用 async 关键字定义了一个函数,它就会返回一个承诺。如果使用 await 关键字(getData 或 processData)的任何一个函数拒绝一个承诺,我想拒绝该承诺 - 我不希望函数的其余部分执行。因此,如果上面的 getData 承诺拒绝,我不希望循环继续或第二个循环开始 - 我想退出返回被拒绝承诺的函数。这是我所追求的正确实施吗?希望这一切都说得通!

标签: javascriptasynchronouspromiseasync-await

解决方案


所有的try/ catches 都是不必要的。如果一个被awaited 的 Promise 拒绝,整个包含async函数将拒绝,拒绝值将是抛出的错误。你可以简单地做:

async function init() {
    // get the data
    for (var i = 0; i < arr_process.length; i++) {
        await getData(arr_process[i]);
    }
    // now process the data
    for (var i = 0; i < arr_done.length; i++) {
        await processData(arr_done[i]);
    }
}

然后,就像您的原始代码一样,调用者init将捕获任何带有 a 的错误catch

init()
  .catch((err) => {
    console.log('error:', err);
  });

推荐阅读