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)
    })
  • 相关阅读:
    商户网站使用第三方支付的大致原理和实现
    ASP.NET MVC中检测浏览器版本并提示下载更新
    如何选择使用IEnumerable, ICollection, IList
    IEnumerable和IQueryable的区别以及背后的ExpressionTree表达式树
    IEnumerable是集合,IEnumerator是集合的迭代器
    ASP.NET MVC中使用Session来保持表单的状态
    在ASP.NET MVC中实现Select多选
    总结ASP.NET MVC视图页使用jQuery传递异步数据的几种方式
    在ASP.NET MVC4中使用Quartz.NET执行定时任务
    委托, 泛型委托,Func<T>和Action<T>
  • 原文地址:https://www.cnblogs.com/liujinyu/p/7353225.html
Copyright © 2011-2022 走看看