UI5中Promise.resolve捕获的拒绝承诺无法被Promise.all识别如何处理
问题根因
当你给Promise链挂载.catch方法后,只要catch回调内部没有抛出新错误、也没有返回rejected状态的Promise,该catch方法执行完毕后会默认返回一个**fulfilled(已成功)**状态的Promise,相当于把原本promise1的rejected状态给拦截吞掉了。后续Promise.all检测到数组里所有Promise都是成功状态,自然会直接进入then的成功分支。
另外你原代码里then的第二个错误回调参数命名为catch属于语法错误,catch是JavaScript保留关键字,不能作为参数名使用。
可行实现方案
你可以根据业务场景选以下任意一种方案:
- 方案1:内部catch处理完自有逻辑后重新抛出错误
如果你需要在单个promise报错时先执行打日志的逻辑,同时还要让外层Promise.all能感知到错误状态,只需要在catch块末尾把捕获到的错误重新抛出即可:promisesArray.push( Promise.resolve(promise1) .catch((err) => { console.log("Hello World"); throw err; // 重新抛出错误,维持Promise的rejected状态 }) ); - 方案2:内部catch处理完后显式返回拒绝状态的Promise
写法和抛错效果完全一致,适合需要在返回reject前做额外异步处理的场景:promisesArray.push( Promise.resolve(promise1) .catch((err) => { console.log("Hello World"); // 其他同步/异步处理逻辑 return Promise.reject(err); }) ); - 方案3:移除单个Promise的提前catch,统一在外层处理错误
如果日志打印逻辑不需要和单个promise强绑定,可以直接去掉promise上挂载的catch,把所有错误处理逻辑收敛到Promise.all的错误分支里统一处理,从根源上避免提前吞错的问题:// 推入数组时不提前挂载catch promisesArray.push(Promise.resolve(promise1)); Promise.all(promisesArray) .then(() => { // 全部成功的业务逻辑 }) .catch((err) => { console.log("Hello World"); // 统一错误处理逻辑 })
内容的提问来源于stack exchange,提问作者Coding12345
相关产品推荐
相关产品推荐

