promise 分析

67 阅读2分钟

Promise特点

1.对象的状态不受外界影响,promise对象代表一个异步操作,有三种状态:Pending(进行中)、Fulfilled(成功)和 Rejected(已失败),只有异步操作的结果可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。

2.一旦状态改变,就不会再变,任何时候都可以得到这个结果,Promise对象的状态改变,只有两种可能:从Pending变为Resolved和从Pending变为Rejected。只要这两种情况发生,状态就凝固不会再变了,会一直保持这个结果。

有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。

Promise的构造函数接收一个参数,是函数,并且传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数,resolve是将Promise的状态置为fullfiled,reject是将Promise的状态置为rejected。

Promise的优势在于,可以在then方法中继续写Promise对象并返回,然后继续调用then来进行回调操作,Promise的实质是“状态”,用维护状态、传递状态的方式来使得回调函数能够及时调用。

function async1(){
    let p=new Promise((resolve,reject)=>{
        setTimeout(function(){
            console.log("async1")
            resolve("success")
        },1000)
    })    
return p
}

function async2(){
    let p=new Promise((resolve,reject)=>{
        setTimeout(function(){
            console.log("async2")
            resolve("success")
        },1000)
    })    
return p
}
function async3(){
    let p=new Promise((resolve,reject)=>{
        setTimeout(function(){
            console.log("async3")
            resolve("success")
        },1000)
    })    
return p
}

async1().then(function(res){
    console.log(res)
    return async2()
}).then(res=>{
    console.log(res)
    return async3()
}).then(res=>{
    console.log(res)
})

// 打印结果
async1
success
async2
success
async3
success

基本的 api

then

Promise.prototype.then(),then方法可以接受两个参数,第一个对应resolve的回调,第二个对应reject的回调

catch

Promise.prototype.catch(),其实它和then的第二个参数一样,用来指定reject的回调

all

Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调

Promise.all([async1(), async2(), async3()])
.then(function(results){ 
    console.log(results)
});

race

三个异步操作同样是并行执行的,执行async1,已经执行完了,此时then里面的回调就执行了,race只执行一个回调函数,谁跑的快先执行谁,例如我们可以用race给某个异步请求设置超时时间,并且在超时后执行相应的操作

Promise.race([async1(), async2(), async3()]).then(function(results){
    console.log(results)
});