promise 基础学习 (4)

调用:

var def1 = new Deferred(function(resolve, reject) { resolve(1); }); var def2 = new Deferred(function(resolve, reject) { reject(2); }); def1.then(function(e) { console.log('success:' + e); return e + 1; }, function(e) { console.log('error:' + e); return e + 1; }).then(function(v) { console.log(v); }); def2.then(function(e) { console.log('success:' + e); return e + 1; }, function(e) { console.log('error:' + e); return e + 1; }).then(function(v) { console.log(v); }); Promise的常见问题 Promise的同步与异步执行 var p = new Promise(function(resolve,reject){ console.log(1); resolve(2); console.log(4) }); p.then(function(){ console.log(3); }) console.log(5)

在实例化对象的时候,代码的执行依然是同步执行,而实例化对象的状态回调函数 then,catch 才是异步执行。

状态改变 var p = new Promise(function(resolve,reject){ resolve('success1'); reject('error1'); resolve('success2'); }); p.then(function(e){console.log(e)}).catch(function(v){console.log(v)})

Promise 的状态一旦确定将无法改变。

异常情况下的Promise Promise.resolve(1).then(function(v) { console.log(v); return new Error('error!!!'); }).then(function(v) { console.log(v); }).catch(function(e) { console.log(e); });

resolve() 进入了第一个then的回调,虽然返回了一个 error 类型,但是是通过 return 返回的,所以它将会被作为第二个 then 的值接收,并不会改变promsie的状态,所以后面的 catch 便不会被触发。
如果想触发catch也很简单,只需要使用下面两种方式的任何一种即可。

return new Promise().reject(1)

throw new Error('xxx')

Promise.resolve(1).then(function(v) { console.log(v); return new Error('error!!!'); }).then(function(v) { return Promise.reject(1); }).catch(function(e) { console.log(e); });

虽然触发了最后的 catch 回调,但是否与 Promise 定义的标准相悖呢?毕竟 promsie对象的状态一经发生,便无法改变的...实际上并不是如此,因为我们之前已经说过, then、catch 等都会返回要给新的 promise 对象,而且这里 return Promise.reject(1) 返回的本身就是一个新的对象。

值的穿透 Promise.resolve(1) .then(2) .then(Promise.resolve(3)) .then(console.log)

.then 或者 .catch 的参数期望是函数,传入非函数则会发生值穿透。

参考

(开源Promise 迷你书)

https://zhuanlan.zhihu.com/p/30797777 Promise 必知必会(十道题)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpsgdy.html