es6 promise的catch 和 then 的区别认识

从链式调用的情况下看,

catch是then的语法糖,表现出的规律性如下。

catch 返回实值:Promise {<resolved>: 1}
catch 抛出错误:Promise {<rejected>: "err"}
catch 无返回: Promise {<resolved>: undefined}

then 返回实值:Promise {<resolved>: 1}
then 抛出错误:Promise {<rejected>: "err"}
then 无返回: Promise {<resolved>: undefined}

而Promise对象的本身对链式调用与否的结构又是如何呢? 这是所有人都清晰的

resolved状态下:then执行,catch不执行
rejected状态下: then不执行,catch执行

在平时使用时?

关键在于undefined下,其实也属于resolved状态,

所以会有这个特点
我们经常使用时并不会在then和catch中去返回特定的值,
于是我们假定callA和callB中返回的都是undefined:
我们的想要的结果是:resolve时只执行callA,reject时只执行callB

P_resolve.then(callA).catch(callB) callA执行后,callB不执行 符合
P_reject.then(callA).catch(callB) callA不执行后,callB执行 符合
而如果这样使用
P_reject.catch(callB).then(callA) 当callB执行时,callA也会被执行 不符合
P_resolve.catch(callB).then(callA) 当callB不执行,callA会被执行 符合

因此如果在复杂的链式调用中出现catch后会接上then的情况,catch中一定需要写上返回reject态的Promise,当你不需要执行后续的then时。

但同时也会导致,在后续没有另外一个catch的话,该catch抛出的错误被抛到应用顶层,最终系统报错。

基本也就能认为, 如果要安全地使用Promise,保证系统不报错的前提下,catch必须被最后调用并返回resolve状态。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • JavaScript里通常不建议阻塞主程序,尤其是一些代价比较昂贵的操作,如查找数据库,下载文件等操作,应该用异步...
    张歆琳阅读 7,647评论 0 12
  • 在ES6当中添加了很多新的API其中很值得一提的当然少不了Promise,因为Promise的出现,很轻松的就给开...
    嘿_那个谁阅读 9,001评论 2 3
  • 1. Promise 的含义 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个...
    ROBIN2015阅读 3,452评论 0 0
  • Promise 含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强...
    Upcccz阅读 1,618评论 0 0
  • 你不知道JS:异步 第三章:Promises 在第二章,我们指出了采用回调来表达异步和管理并发时的两种主要不足:缺...
    purple_force阅读 6,330评论 0 4