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)
    })
  • 相关阅读:
    C#获取屏幕鼠标所指点的颜色
    C#连接SQLServer数据库基本实现
    论文摘要写法
    红黑树
    递归、迭代和分治法
    逻辑右/左移与算术右/左移
    C 中数字数据类型在不同机器上所占字节数
    十进制转十六进制
    c带头结点的单链表逆置
    求一维数组长度误区
  • 原文地址:https://www.cnblogs.com/liujinyu/p/7353225.html
Copyright © 2011-2022 走看看