zoukankan      html  css  js  c++  java
  • 关于defer.promise.then 异步的一个疑问 | 用柯里化做promise | 用递归做promise

    疑问:感觉会报错,因为执行到defer.promise.then这时候还没到defer.resolve,因为异步读文件,总归会慢

    解答:先执行defer.promise.then,是给callback赋值,函数的赋值会比较抽象,callback得到函数的赋值后,是函数就该等待执行,等待resolve的时候,执行,其实也是回调的方式,

    关键点:实参是函数,就是形参被复值成函数,把形参当函数看

    var Defer = function(){
        var value,callback;
        return {
            resolve :function(val){
                value = val;
                callback(val);
            },
            promise:{
                then:function(fn){
                    callback = fn;
                }
            }
        }
    }
    
    var fs = require('fs');
    var defer = new Defer();
    fs.readFile('data/account/accountInfo_0.html',(err,data)=>{
        console.log(2)
        defer.resolve(data)
    })
    console.log(1)
    defer.promise.then(function(resData){
        console.log(3)
        console.log(resData)
    });

     ===============================================

    柯里化做promise

    var Defer = function(){
        var value,successes=[],errors=[];
        return {
            resolve :function(val){
                successes.forEach(v=>{
                    if(!value){
                        value = v(val);
                    }else{
                        value = v(value)
                    }
                })
            },
            reject:function(err){
                errors.forEach(v=>{
                    v(err)
                })
            },
            promise:{
                then:function(fn){
                    successes.push(fn);
                    return this;
                },
                catch:function(fn){
                    errors.push(fn);
                    return this;
                }
            }
        }
    }
    
    var fs = require('fs');
    function readFile(filter){
        var defer = new Defer();
        fs.readFile(filter,'utf8',(err,data)=>{
            if(err){
                defer.reject(err)
            }else{
                defer.resolve(data)
            }
        })
        return defer.promise;
    }
    // 当注册成功之后的回掉函数
    var promise = readFile('test.txt');//my name is:
    promise.then(res=>{
        return res+'liujiny';
    }).then(res=>{
        console.log(res);//my name is:liujinyu
        return fs.readFileSync('data/account/accountInfo_0.html');
    }).then(res=>{
        console.log(res+'')
    }).catch(err=>{
        console.log('err',err)
    })

    ------------------------------------------

    用递归做promise

    var Defer = function(){
        var success=[],
            errors=[];
        return {
            resolve:function(_value){
                success.forEach(v=>{
                    v(_value)
                })
            },
            reject:function(err){
                errors.forEach(v=>{
                    v(err)
                })
            },
            promise:{
                then:function(fn){
                    var d = new Defer();
                    var _fn = function(_value){
                        d.resolve(fn(_value));
                    }
                    success.push(_fn);
                    return d.promise;
                },
                catch:function(fn){
                    errors.push(fn);
                    return this;
                }
            }
        }
    }
    
    var fs = require('fs');
    function readFile(filter){
        var defer = new Defer();
        fs.readFile(filter,'utf8',(err,data)=>{
            if(err){
                defer.reject(err)
            }else{
                defer.resolve(data)
            }
        })
        return defer.promise;
    }
    // 当注册成功之后的回掉函数
    var promise = readFile('name.txt');//my name is:
    promise.then(val=>{
        return val+'liujiny';
    }).then(res=>{
        console.log(res);//my name is:liujinyu
        return fs.readFileSync('age.txt');//27
    }).then(res=>{
        console.log(res);//27
    }).catch(err=>{
        console.log('err',err)
    })
  • 相关阅读:
    【ORA-02049】超时分布式事务处理等待锁 解决方法
    Git使用出错:Couldn‘t reserve space for cygwin‘s heap, Win32
    JS身份证号码校验
    linux 下查看cpu位数 内核等参数命令(转)
    linux ps命令,查看进程cpu和内存占用率排序(转)
    JAVA图片验证码
    JAVA BigDecimal 小数点处理
    Linux命令大全
    Eclipse Java注释模板设置详解
    JSONArray的应用
  • 原文地址:https://www.cnblogs.com/liujinyu/p/7353225.html
Copyright © 2011-2022 走看看