Promise

2019-08-02  本文已影响0人  冰镇苏打水

Promise

promise坠落现象

Promise.resolve('foo').then(Promise.resolve('bar')).then(res=>{
    console.log(res)
})
<!-- log 'foo' -->

与 setTimeout 执行顺序

setTimeout(()=>{
  console.log('setTimeout')
})
let p1 = new Promise((resolve)=>{
  console.log('Promise1')
  resolve('Promise2')
})
p1.then((res)=>{
  console.log(res)
})
console.log(1)

<!-- log `1 , Promise1 , Promise2 , setTimeout` -->

实现简单的 Promise

function Promise(fn){
    var status = 'pending';
    function successNotify(){
        status = 'fulfilled'
        toDoThen.apply(undefined, arguments);
    }
    function failNotify(){
        status = 'rejected'
        toDoThen.apply(undefined, arguments);
    }
    
    function toDoThen(){
        setTimeout(()=>{
            if(status === 'fulfilled'){
                for(let i = 0; i < successArray.length; i++){
                    successArray[i].apply(undefined, arguments)
                }
            }
            if(status === 'rejected'){
                for(let i = 0; i < failArray.length; i++){
                    failArray[i].apply(undefined, arguments)
                }
            }
        })
    }
    
    var successArray = [];
    var failArray = [];
    
    fn.call(undefined,successArray,failArray);
    return {
        then: function(successFn,failFn){
            successArray.push(successFn);
            failArray.push(failFn);
            return undefined;
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读