首页 > 解决方案 > 过早处理被拒绝的承诺会有什么后果?

问题描述

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

过早处理被拒绝的承诺会在承诺链的下游产生后果。

会有什么样的后果?在哪些情况下应避免及早处理拒绝,在哪些情况下应优先处理拒绝?

标签: javascriptnode.jspromise

解决方案


要理解的关键部分是 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()


推荐阅读