javascript - 在函数中使用多个等待,循环和处理错误
问题描述
我正在努力解决这个问题。我已经搜索过类似的问题。
基本上,我有 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 承诺拒绝,我不希望循环继续或第二个循环开始 - 我想退出返回被拒绝承诺的函数。这是我所追求的正确实施吗?希望这一切都说得通!
解决方案
所有的try
/ catch
es 都是不必要的。如果一个被await
ed 的 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);
});
推荐阅读
- java - 即使在抛出标记为 rollBackFor 的异常之后,是否可以防止外部事务上下文回滚?
- javascript - javascript - 一次替换多个文本
- json - 如何在 golang 或一般类型的语言中处理 JSON 响应中的不同类型
- c# - 我可以在 System.Speech.Synthesis 中使用 Microsoft 语音以外的语音吗
- python - 如何用 Python 制作一个有生命的游戏?
- postgresql - 在函数中加密密码不起作用 - postgres
- c# - 即使站点未运行或导致站点始终处于活动状态,也使计时器工作
- c# - 如何将文件(内容)从 Angular 5 应用程序传递到 C# .NET Web Api 2?
- c# - 在卸载 Wix 时删除整个用户帐户足迹
- python - 目标检测的输入图像大小估计中的感受野