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 !

  • 相关阅读:
    leetcode108 Convert Sorted Array to Binary Search Tree
    leetcode98 Validate Binary Search Tree
    leetcode103 Binary Tree Zigzag Level Order Traversal
    leetcode116 Populating Next Right Pointers in Each Node
    Python全栈之路Day15
    Python全栈之路Day11
    集群监控
    Python全栈之路Day10
    自动部署反向代理、web、nfs
    5.Scss的插值
  • 原文地址:https://www.cnblogs.com/zhishaofei/p/4031124.html
Copyright © 2011-2022 走看看