Promise

作者: 冰镇苏打水 | 来源:发表于2019-08-02 14:55 被阅读0次

Promise

promise坠落现象

Promise.resolve('foo').then(Promise.resolve('bar')).then(res=>{
    console.log(res)
})
<!-- log 'foo' -->
  • 以上输出为 foo .会很奇怪

  • Promise的then方法的参数期望是函数,传入非函数则会发生值穿透。

  • 因为给 then方法传递了一个非函数(比如promise对象)的值 代码会理解为 then(null), 因此导致前一个promise的结果产生了坠落的效果

  • 更新

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

与 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;
        }
    }
}

相关文章

网友评论

      本文标题:Promise

      本文链接:https://www.haomeiwen.com/subject/btpgrctx.html