每一个Promise都有本身的一个生命周期,开始未处理而后变成已处理。开始pedding状态表示进行中,操做结束后。Promise可能进入如下两种状态某一个:
内部[[PromiseState]]用来表示三个状态:pending,fulfilled及rejected。这个属性并无暴露在Promise对象上,因此检测不到。Promise状态改变的时候经过then得到。promise
全部Promise都有then方法,两个参数:第一个是Promise的状态变为fulfilled时候调用的函数,与异步操做有关数据传递给这个参数。第二个是变为rejected时执行的函数,失败相关附加数据能够经过参数传递给这个拒绝函数。异步
- Tips
注意new Promise的时候传递函数会当即执行而且函数体内的操做是一个同步操做。
new Promise((res,rej) =>{}),接收一个函数做为参数,函数有两个参数是两个callback表示成功和失败的时候执行的。函数
let p = new Promise((res,rej) => { console.log(1,'1') res("success") console.log(2,'2') }) p.then((resolve)=>{ console.log(resolve,'resolve') },(reject)=> { console.log(reject,'reject') }) console.log(4) // 输出顺序 1 2 4 success
Promise链的一个重要特性就是能够给下游Promise传递数据,若是在完成处理程序中指定一个返回值,则能够沿着这条链继续传递数据。ui
- Tips:
- Promise链中的返回值若是是Promise对象的话根据返回的Promise状态进行执行对应then和catch,若是return一个非Promise那么会把它使用Promise.resolve包装成为一个fulfilled状态的Promise。
- 若是then中没有return值,那就至关于return一个空的Promise对象(已完成状态)。好比:
let a = new Promise((res,rej) => { res(6) }) a.then((res) => { console.log(res,'第一个执行完成') // 6 }).then(res=> { console.log("第二个返回打印",res) // 第二个返回打印 undefined })
链式调用Promise:
let p1 = new Promise(function (resolve,reject) { resolve(42) }) p1.then(function(value) { console.log(value) // return一个常量 then中的return会自动包装为Promise.resolve(xx) return value+1 }).then((res) => { console.log(res) // 43 }) // 拒绝处理程序中是一样的 let p1 = new Promise((reslove,reject) => { reject(42) }) p1.catch((rej) => { console.log(rej) return rej+1 // return非Promise对象,使用Promise.resolve包装 }).then((value) => { console.log(value) //43 })
Promise的错误捕捉有两种方式
let a = new Promise((res,rej) => { rej(2) }) a.then( (res) => { // success do },(rej) => { // reject do console.log(2) // 2 })
let a = new Promise((res,rej) => { rej(2) }) a.then(res => { // success do }).catch(err => { // do sth })
catch函数能够在链式调用的时候看成整个链的Promise错误处理程序。
a.then(res=> { }).then(res=> { }).then((res) => { }).catch(rej => { // 任意一个环节走到错误都会走到.catch这里 // 而且无return中断环节的执行(由于已经catch失败,第一个then就调用不到了,因此链式结束)。 })
Promise类和其余内建类型一致,也能够做为基类派生类,因此也能够定义本身的Promise变量来扩展Promise的功能。
class MyPromise extends Promise { // 使用默认的Promise构造函数 success(resolve,reject) { return this.then(reslove,reject) } failure(reject) { return this.catch(reject) } } let promise = new MyPromise(function (resolve,reject) { resolve(42) }) promise.success(function(value) { console.log(value) },function(value) { console.log(value) }) // or promise.failure(function (value) { console.log(value) })
这个例子中扩展了两个success和failure方法。 这两个方法都经过this调用它模仿的方法,派生Promise与内建Promise功能一致,只不过多了success和failure这两个能够调用的方法。用于静态方法会也会被继承,所以派生的Promise也都存在MyPromise.resolve(),MyPromise.reject(),MyPromise.all(),MyPromise.race()静态方法。
后二者与内建方法彻底不一样,前两个稍有不一样。this