我正在努力解决这个问题。我一直在寻找类似的问题。
基本上,我有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承诺被拒绝,我不希望循环继续进行或第二个循环开始-我想退出返回被拒绝的承诺的函数。这是我所追求的正确实现吗?希望一切都有道理!
答案 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]);
}
}