zoukankan      html  css  js  c++  java
  • promise实现(未实现微任务)

    promise实现

    promsie接收一个函数作为参数
    有:

    function Promise(fn){
        fn()
    }
    

    这个函数fn接收两个参数用来控制Prmosise实例的状态,这两个参数在Promise内部传给fn
    有:
    有:

    function Promise(fn){
        const res = function(){}
        const rej = function(){}
        fn(res,rej)
    }
    

    res能改变Promise实例的状态所以,Promise有一个公有属性status,并且res、rej可以改变他们
    有:

    function Promise(fn){
        this.status = 'padding'
        const res = this.res.bind(this)
        const rej = this.rej.bind(this)
        fn(res,rej)
    }
    Promise.prototype.res = function(){
        this.status = 'res'
    }
    Promise.prototype.rej = function(){
        this.status = 'rej'
    }
    

    Promise有一个then方法,当status改变的时候会执行,否则会等待status改变。
    所以,其实then做了两件事情,检查status是否改变,执行回调。
    有:

    function Promise(fn){
        this.status = 'padding'
        const res = this.res.bind(this)
        const rej = this.rej.bind(this)
        fn(res,rej)
    }
    Promise.prototype.res = function(){
        this.status = 'res'
    }
    Promise.prototype.rej = function(){
        this.status = 'rej'
    }
    Promise.prototype.then = function(callback_res,callback_rej){
        if(this.status==='res'){
            callback_res()
        }
        if(this.status==='rej'){
            callback_rej()
        }
    }
    

    上面当status没有改变的时候,then的回调无法执行。所以在status改变后需要将then的回调执行,在status没有执行的时候可以先把它存在Promise实例对象中。
    有:

    function Promise(fn){
        this.status = 'padding'
        const res = this.res.bind(this)
        const rej = this.rej.bind(this)
        const res_fn = []/*  */
        const rej_fn = []/*  */
        fn(res,rej)
    }
    Promise.prototype.res = function(){
        this.status = 'res'
        this.res_fn.forEach(function(fn){ /*  */
            if(typeof fn === 'function'){
                fn()
            }
        })
    }
    Promise.prototype.rej = function(){
        this.status = 'rej'
        this.rej_fn.forEach(function(fn){ /*  */
            if(typeof fn === 'function'){
                fn()
            }
        })
    }
    Promise.prototype.then = function(callback_res,callback_rej){
        if(this.status==='res'){
            callback_res()
        }
        if(this.status==='rej'){
            callback_rej()
        }
        if(this.status==='padding'){/*  */
            this.res_fn.push(callback_res)
            this.rej_fn.push(callback_rej)
        }
    }
    

    res、rej分别接收一个参数,该参数将分别作为callback_res、callback_rej的参数。
    有:

    function Promise(fn){
        this.status = 'padding'
        const res = this.res.bind(this)
        const rej = this.rej.bind(this)
        const res_value
        const rej_value
        const res_fn = []
        const rej_fn = []
        fn(res,rej)
    }
    Promise.prototype.res = function(){
        this.status = 'res'
        this.res_fn.forEach(function(fn){ 
            if(typeof fn === 'function'){
                fn()
            }
        })
    }
    Promise.prototype.rej = function(){
        this.status = 'rej'
        this.rej_fn.forEach(function(fn){ 
            if(typeof fn === 'function'){
                fn()
            }
        })
    }
    Promise.prototype.then = function(callback_res,callback_rej){
        if(this.status==='res'){
            callback_res()
        }
        if(this.status==='rej'){
            callback_rej()
        }
        if(this.status==='padding'){
            this.res_fn.push(callback_res)
            this.rej_fn.push(callback_rej)
        }
    }
    
  • 相关阅读:
    C语言 · 报时助手
    C语言 · 完美的代价
    C语言 · 十六进制转八进制
    C语言 · 十六进制转十进制
    C语言 · 芯片测试
    C语言 · 素数求和
    C语言 · 五次方数
    Lodop多分出空白页的可能(情况1)
    C-Lodop提示“网页还没下载完毕,请稍等一下再操作.”
    Lodop简答问答大全
  • 原文地址:https://www.cnblogs.com/AFu-1993/p/12758648.html
Copyright © 2011-2022 走看看