zoukankan      html  css  js  c++  java
  • 用async 解放你的大脑

    在js中,代码嵌套和代码回调非常常见,不仅编写麻烦而且异常反人类。让我等码农很是头痛

    function () {
        function () {
            function () {
                function () {
                    //pass
                }
            }
        }
    }
    

     这是一个常规的嵌套,如果每个function 的逻辑处理都比较多的话,会导致整个代码非常长,不仅编码困难,而且阅读起来也是很是蛋疼, 这种情况在js 中还是比较好的情况 ,还有非常恶劣的情况 ,考虑下在 异步嵌套的情况

    var path = './async.txt';
    // check if async.txt exists
    fs.stat(path, function (err, stats) {
        if (err)
            return err
        if (stats == undefined) {
            fs.readFile(__filename, function (err, content) {
                if (err)
                    return err
                var code = content.toString();
                fs.writeFile(path, code, function (err) {
                    if (err)
                        return err
                    console.log('async.txt created!');
                });
            });
        }
    });
    

     这是一个异步嵌套代码,先检查文件是否存在,不存在则把某个文件的内容提取出来然后在写入另外一个文件,看起来还算好,但是遗憾的是这样的编写无法把错误 return 到顶层例如 fs.writeFile return 的err 无法 在fs.stat 中接受到。如果想在外层接受到内部抛出的错误你会见到非常反人类的代码,如下

    function start (path,filePath){
        stats(path,function(err,stat){
            if (err)                       
                return err;        
            else if(stat == undefined){
                reads(filePath,function(err,data){
                    if (err)
                        return err;
                    var code = data.toString();
                    writes(code,function(err,result){
                        if (err)
                            return err
                        console.log('async.txt created!');
                    })                
                })
            }
        })
    }
    
    
    function stats (path, fn) {
        fs.stat(path, function (err, stats) {
            if (err)
                fn(err, null);
            fn(null, stats);
        });
    }
    
    function reads (filePath,fn){
        fs.readFile(filePath,function(err,content){
            if (err)
                fn(err, null);
            fn(null, content);
        });
    }
    
    
    function writes(data,fn){
        fs.writeFile(filePath,data,function(err,content){
            if (err)
                fn(err, null);
            fn(null, content);
        });
    }

    wtf ,这样恶心的代码 实在无法让人喜欢,但是不得已为之,如果想在外层接受错误信息在没有async 之前 常规的写法就是上面那样 把异步代码包括回调抽出来成为一个单一的方法 然后调用,这样会导致代码的结构更加臃肿 更加反人类,看了一眼就不想看第二眼的! 不仅编写的痛苦,维护的更痛苦

    但是有了async 一切就不同了

    var fs = require('fs');
    var async = require('async');
    
    var path = './async.txt';
    async.waterfall([
        // check if async.txt exists
        function(cb) {
            fs.stat(path, function(err, stats) {
                if (stats == undefined) cb(null);
                else console.log('async.txt exists');
            });
        },
        // read the contents of this file
        function(cb) {
            fs.readFile(__filename, function(err, content) {
                var code = content.toString();
                cb(null, code);
            });
        },
        // write the content to async.txt
        function(code, cb) {
            fs.writeFile(path, code, function(err) {
                if (err) throw err;
                console.log('async.txt created!');
            });
        }
    ]);

    改变之后的结构就像同步那样编写异步回调代码,不仅结构清晰而且代码编写非常简单,写完之后顿时 头不痛了,腿不酸了,感觉时间如此美好了 !这等利器真是解放我等码农的大杀器啊! 当然还有老赵的 wind.js 更符合。net 4.5 中async 和await 的写法 ,很是犀利

    async 传送门 https://github.com/caolan/async#waterfall
    wind.js 传送门 http://windjs.org/cn/

    当然在nodejs 鼎鼎大名的 async 不会只有这点功能,奈何小弟才疏学浅,疏于皮毛,仅会于此,如有任何错误,欢迎拍砖
    enjoy !

  • 相关阅读:
    伐木工和森林的故事(一)
    EclipsePDT PHP的开发环境配置
    奇怪的using
    [团队开发]SERVER2008下无法安装VS2008 SP1 和 TFS2008 SP1补丁
    写在七夕
    一点点的松懈,就可以毁掉自己!
    2008,到今天我不后悔
    细节决定成败,注意的事情需要做到,而不是听完了当耳边风
    正视差距,展望2008!
    ZendStudio5.5调式环境配置
  • 原文地址:https://www.cnblogs.com/trigged/p/2921885.html
Copyright © 2011-2022 走看看