javascript - 过早处理被拒绝的承诺会有什么后果?
问题描述
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
过早处理被拒绝的承诺会在承诺链的下游产生后果。
会有什么样的后果?在哪些情况下应避免及早处理拒绝,在哪些情况下应优先处理拒绝?
解决方案
要理解的关键部分是 catch() 也返回一个承诺。
考虑以下示例。由于中间 catch 没有返回但 catch() 本身返回一个承诺,最终的 catch 永远不会触发,而最终的 then() 确实...接收undefined
来自先前的 catch() 承诺的结果
const func = (val) => {
return new Promise((resolve,reject)=> {
// not really asynchronous, only contrived for demo
val === 1 ? resolve(val) : reject('Oooops')
}).catch(err=> {console.log('Err in func catch:', err)})
}
func(200).then(res=> console.log('Then res=', res))// receives undefined from prior catch
.catch(err=> console.log('Never gets called'))
因此,您可以根据首选逻辑在此处做几件不同的事情。
您可以从中间捕获返回不同的期望值并在最终捕获中查找它,或者返回另一个被拒绝的承诺或抛出的错误以在最终捕获()中捕获。
或者......如果它没有任何价值拦截它,则根本不要使用中间捕获。
使用中间捕获的示例用例是:
请求 url 的 map() 通过一个函数传递,该函数将请求承诺返回到您的地图数组,但如果不是全部成功,您也可以。
如果没有中间捕获拦截,整个链将在第一次错误请求时中断。相反,您可以从中间捕获中返回一些您在Promise.all().then()
推荐阅读
- java - 如何使用实现类中的方法来捕获 Java 中的事件?
- c# - 从具有日期和时间的字符串中删除时间戳 - C#
- node.js - Angular 兼容项目的对等依赖项?
- heroku - 是否可以停止 Heroku Daily Dyno 重新启动 Hobby Dyno
- java - spring 如何在内部使用 _csrf 参数或 X-CSRF-TOKEN 标头验证 csrf 令牌?
- javascript - $.getscript 添加重复的事件监听器
- ios - 按其 Double 参数之一对 Object 数组进行排序
- google-apps-script - 表单触发器中的错误来源和响应
- internet-explorer - Web 组件、HTML 导入 polyfill 在 Firefox、IE 中不起作用
- javascript - 单击按钮即可截取窗口的屏幕截图