在函数中使用多个等待,循环和处理错误

时间:2019-08-14 07:52:43

标签: javascript asynchronous promise async-await

我正在努力解决这个问题。我一直在寻找类似的问题。

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

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

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关键字定义函数,它将返回一个promise。如果使用await关键字的任何一个函数(getData或processData)都拒绝了诺言,我想拒绝该诺言-我不希望函数的其余部分执行。因此,如果上面的getData承诺被拒绝,我不希望循环继续进行或第二个循环开始-我想退出返回被拒绝的承诺的函数。这是我所追求的正确实现吗?希望一切都有道理!

2 个答案:

答案 0 :(得分:0)

所有try / catch都是不必要的。如果拒绝了await的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的调用者将使用catch捕获任何错误:

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

答案 1 :(得分:0)

只需使用async关键字,就可以在throw函数中引发错误。

例如:

async function init() {
  throw new Error('error message')
}

或者在您的情况下,只需删除try catch块,任何错误都会自动引发。

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]);
  }
}