promise

410 阅读2分钟

这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战

promise

let p1 = new Promise([executor]);

  • new的时候首先第一件事就是把[executor]函数执行

  • 会给[executor]函数传递两个实参信息,resolve函数,reject函数

  • promise 状态status/promise value

    • new promise的时候 status:pending value:undefined
    • resolve函数执行 status:fulfilled/resolved value:传递的第一个实参
    • reject函数执行 status:rejected value:传递的第一个实参
    • 一旦状态改为成功或者失败,则当前操作不可逆转,状态就确定下来了,不能在改变为其他的状态了
    • Promise.prototype上存在三个方法,then/catch/finally
    • then 基于then方法我们可以像当前实例对应的“事件池”中存放0到2个发囊发,如果promise的状态变为成功,会把then中存放的第一个方法执行,如果状态是失败,则then中存放第二个方法执行,不论执行那个方法,都会把value传递
let p1 = new Promise((resolve,reject)=>{

    // 一般在这里会管控一个异步编程操作[executor] 同步
    reslove 和reject 是异步的
    
    setTimeout(()=>{
        resolve(10)
    },1000)
})
p1.then(result=>{
    console.log("result")
},reason = >{
    console.log("reason")
})
let p1 = new Promise((resolve,reject)=>{

    setTimeout(()=>{
        resolve(10)
    },1000)
})
每一次执行then 都会返回新的promise实例,p2实例的状态成功还是失败,以及它的value 值,由p1事件池中的方法执行决定
1 不论执行的是p1成功函数,还是失败的函数,只要代码不报错,不抛出异常信息等,则p2的状态都会变为成功状态,A或者B执行的返回结果,是p2实例的value值,如果报错,则报错信息是value值

2 如果A/B执行没有报错,但是返回结果是一个新的promise实例,则需要等待新的promise实例有结果,用这个结果代替p2的结果
Promise.resolve(100),Promise.reject(200) 返回成功或者失败状态的promise实例
let p2 =  p1.then(result=>{
    console.log("result")
},reason = >{
    console.log("reason")
})

p1.then(result=>{}); p1.catch(reason=>{}) === p1.then(null,reason=>{})

p1.then(result=>{}).catch(reason=>{

})

如果then 中缺少了对应的方法,则会把状态和方法顺延至下一个相同位置的方法上 数组中存放多个promise实例,promise.all会返回一个新的promise实例 let p3 = Promise.all([promise1,promise2]) p3.then(result=>{ result数组,按照顺序存储着每一个实例的value值 }).catch(reason=>{

})

看所有的实例谁先处理完,谁先处理完,就以谁的结果作为p3的结果,不论成功还是失败 let p3 = Promise.race([promise1,promise2]) p3.then(result=>{

}).catch(reason=>{

})