Promise小结

Promise的生命周期

每一个Promise都有本身的一个生命周期,开始未处理而后变成已处理。开始pedding状态表示进行中,操做结束后。Promise可能进入如下两种状态某一个:
  • Fuiflled Promise操做完成。
  • Rejected 程序错误或者其余缘由Promise为能够完成。

image.png

内部[[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链的一个重要特性就是能够给下游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错误解决方案

Promise的错误捕捉有两种方式
  1. then函数的第二个参数。
let a = new Promise((res,rej) => {
    rej(2)
})

a.then( (res) => {
    // success do
},(rej) => {
    // reject do
    console.log(2) // 2
})
  1. catch函数
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变量来扩展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

相关文章
相关标签/搜索