前言
本文是有关《Javascript高级程序设计》第11章内容的总结,并结合掘金的一些博客,总结一下Promise
Promise
基本用法
关于Promise的一些Api和基础的用法,相信大家有已经了解,这里就不再赘述,只是做一个小的总结
这是Promise的一些Api,不熟悉的可以自行百度查看~
同步/异步执行的二元性
try { Promise.reject(new Error('bar')); } catch(e) { console.log(e); } // Uncaught (in promise) Error: bar
这里的Promise.reject()明明是同步创建出来一个reject的promise的实例,为什么还是不能被try...catch...捕获到呢?
这里的同步代码之所以没有捕获Promise抛出的错误,是因为它没 有通过异步模式 捕获错误。从这里就可以看出Promise真正的异步特性: 它们是同步对象(在同步执行模式中使用),但也是异步执行模式的媒介。
拒绝Promise的错误并没有抛到执行同步代码的线程 里,而是通过浏览器异步消息队列来处理的。因此,try /catch 块 并不能捕获该错误。代码一旦开始以异步模式执行,则唯一与之交互 的方式就是使用异步结构——更具体地说,就是Promise的方法。
thenable接口
任何对象有一个then()方法,就认为是实现了Thenable接口
class MyThenable { then() {} } const MyThenable = { then(){} } const MyThenable = { then: function(){} }
Promise.prototype.then()
let p1 = new Promise((resolve) => {resolve('p1')}) let p2 = p1.then(() => { console.log('p2') }) let p3 = p2.then(() => { console.log('p2的状态',p2) console.log('p3') }) // p2 // p2的状态 Promise { undefined } // p3
新期约实例基于onResovled 处理程序的返回值构建。换句话说,该处理程序的返回值会通过Promise.resolve() 包装来生成新 期约。如果没有提供这个处理程序,则Promise.resolve() 就会包 装上一个期约解决之后的值。如果没有显式的返回语句,则 Promise.resolve() 会包装默认的返回值undefined 。
由于p1没有返回值,所以p2的值是undefined,但是都是resolved的状态
注意
抛出异常会返回拒绝的期约
返回错误值不会触发上面的拒绝行为,而会把错误对象包装在 一个解决的期约中
Promise.resolve
- 如果参数是 Promise 实例,那么
Promise.resolve
将不做任何修改、原封不动地返回这个实例 - 参数是一个
thenable
对象,Promise.resolve()
方法会将这个对象转为 Promise 对象,然后就立即执行thenable
对象的then()
方法。 - 如果参数是一个原始值,或者是一个不具有
then()
方法的对象,则Promise.resolve()
方法返回一个新的 Promise 对象,状态为resolved
。