es6 promise的catch 和 then 的区别认识

JavaScript026

es6 promise的catch 和 then 的区别认识,第1张

catch 返回实值:Promise {<resolved>: 1}

catch 抛出错误:Promise {<rejected>: "err"}

catch 无返回:Promise {<resolved>: undefined}

then 返回实值:Promise {<resolved>: 1}

then 抛出错误:Promise {<rejected>: "err"}

then 无返回:Promise {<resolved>: undefined}

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状态。

then: function (callback, errback) {

var result = defer()

有两个部分,then 和 always,两个都是可执行的方法。

always 这里不作讨论。来看看then ,它有两个参数,callback 和 errback, 第一个用来处理“resolved”和“success”事件;第二个用来处理“rejected”和“failure”事件。

所以,delay.promise不是现成的数据,还不能直接使用。然后来看看这个then怎么使用(主要是如何从中提取出我们需要的后台返回的数据):

then()方法是异步执行。

意思是:就是当.then()前的方法执行完后再执行then()内部的程序,这样就避免了,数据没获取到等的问题。

语法:promise.then(onCompleted, onRejected)

参数

promise必需。Promise 对象。

onCompleted必需。承诺成功完成时要运行的履行处理程序函数。

onRejected可选。承诺被拒绝时要运行的错误处理程序函数

举例

可以理解成navigator.mediaDevices.getUserMedia(constrains) 返回一个参数stream ,然后执行function功能