繁体   English   中英

过早处理被拒绝的承诺有什么后果?

[英]What are the consequences of handling a rejected promise too early?

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

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

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

要理解的关键部分是 catch() 也返回一个承诺。

考虑以下示例。 由于中间的 catch 没有返回值,但是 catch() 本身返回一个 promise,最终的 catch 永远不会触发,最后的 then() 确实......从先前的 catch() 承诺接收undefined的结果

 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'))

因此,您可以根据首选逻辑在这里做一些不同的事情。

您可以从中间 catch 返回不同的预期值并在最后的 then 中查找该值,或者返回另一个被拒绝的承诺或抛出的错误以在最终的 catch() 中捕获。

或者...如果中间捕获没有拦截它的价值,则根本不要使用它。


使用中间捕获的示例用例是:

请求 url 的 map() 传递通过一个函数,该函数将请求承诺返回到您的地图数组,但如果不是全部成功,您就可以了。

如果没有中间捕获拦截,整个链将在第一个错误请求时中断。 相反,您可以从中间捕获中返回一些您在Promise.all().then()过滤掉的Promise.all().then()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM