在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 !

用async 解放你的大脑的更多相关文章

  1. Java To CSharp源代码转换

    前言 开发环境 客户端:Unity3D开发(C#) 服务器:Java (基于Java7) 日   期:2016年09月 需求说明 部分服务器的部分逻辑功能在客户端实现一遍,可以简单的理解为服务器的部分 ...

  2. 初识java这个小姑娘(二)

    妙解垃圾回收机制 周一,早高峰. 一段考验一个人耐力.智力.开车技术以及脾气的路. 我把车开进了一个没有红绿灯的丁字路口,然后就没有然后了. 来自三个方向的大车小车开始在不大的一块空间里开始互相斗智斗 ...

  3. 每个程序员都可以「懂」一点 Linux

    提到 Linux,作为程序员来说一定都不陌生.但如果说到「懂」Linux,可能就没有那么多人有把握了.到底用 Linux 离懂 Linux 有多远?如果决定学习 Linux,应该怎么开始?要学到什么程 ...

  4. CQRS学习——Cqrs补丁,async实验以及实现[其二]

    实验——async什么时候提高吞吐 async是一个语法糖,用来简化异步编程,主要是让异步编程在书写上接近于同步编程.总的来收,在await的时候,相当于附加上了一个.ContinueWith(). ...

  5. 【译】异步JavaScript的演变史:从回调到Promises再到Async/Await

    我最喜欢的网站之一是BerkshireHathaway.com--它简单,有效,并且自1997年推出以来一直正常运行.更值得注意的是,在过去的20年中,这个网站很有可能从未出现过错误.为什么?因为它都 ...

  6. You Don't Know JS: Async & Performance(第2章,Callbacks)

    Chapter 2: Callbacks. Callbacks are by far the most common way that asynchrony in JS programs is exp ...

  7. ES2017 中的 Async 和 Await

    ES2017 在 6 月最终敲定了,随之而来的是广泛的支持了我最喜欢的最喜欢的JavaScript功能: async(异步) 函数.如果你也曾为异步 Javascript 而头疼,那么这个就是为你设计 ...

  8. AI+教育落地,百度大脑如何让校园更智能?

    人工智能作为影响社会底层技术革命逐渐向传统行业渗透,“AI+”已经替代“互联网+”成为创业创新的新引擎,出人意料的是,在AI在教育业的率先落地并且相当火爆. 现在,人工智能教育已成为从业者心目中的“教 ...

  9. js中异步方案比较完整版(callback,promise,generator,async)

    JS 异步已经告一段落了,这里来一波小总结 1. 回调函数(callback) setTimeout(() => { // callback 函数体 }, 1000) 缺点:回调地狱,不能用 t ...

随机推荐

  1. PLSQL DEVELOPER 使用的一些技巧【转】

    1.登录后默认自动选中My Objects 默认情况下,PLSQL Developer登录后,Brower里会选择All objects,如果你登录的用户是dba,要展开tables目录,正常情况都需 ...

  2. WAS缓存导致的修改文件不生效问题【转】

    WAS缓存导致的修改文件不生效问题: 解决方法: 一. 修改web.xml文件,需要修改以下三个目录下的文件: 1. /opt/IBM/WebSphere/AppServer/profiles/Dmg ...

  3. border-radius属性值参数详解

    border-radius是CSS3设置圆角的一个属性,其属性值得单位可以使用:em.px.百分比等等.但是,border-radius属性值得参数形式有好多种,那么具体都代表什么意思呢?下面以实际例 ...

  4. Android jni 编程2(对基本类型一维整型数组的操作)

    参考教程和这位博主的对一维数组的处理,主要包括以下三种类型: //传入一维数组,无返回值 public native void arrayEncode(int[] arr); //传一个一维数组和数组 ...

  5. 【吐血整理】svn命令行,Subversion的正确使用姿势~

    一.写在前面 前面一直博主一直用svn的桌面版本,但看项目经理一直都用的命令行方式,不为性能,还能直接装逼呀!在这里先感谢赵哥,也把它分享给感兴趣的你们~ 二.直接上干货 1. svn checkou ...

  6. 如何用docker安装laravel开发环境

    如何用docker安装laravel开发环境 看laravel框架的官方文档安装部分时,发现需要安装特别多软件,估计还有许多复杂的配置,官方推荐使用Laravel Homestead虚拟机进行安装,但 ...

  7. 尝试回答js问题

    看到@玉伯的这篇文章<Sea.js 源码解析(三)>给的几个问题,在综合下面的评论,写出自己的总结: 我们知道 typeof new String("xxx") 返回 ...

  8. PHP结合memcacheq消息队列解决并发问题

    在处理业务逻辑时有可能遇到高并发问题,例如商城秒杀.微博评论等.如果不做任何措施可能在高瞬间造成服务器瘫痪,如何解决这个问题呢?队列是个不错的选择.队列(Queue)又称先进先出(First In F ...

  9. Ceph部署(二)RGW搭建

    背景 Ceph RGW简介 Ceph RGW基于librados,是为应用提供RESTful类型的对象存储接口.RGW提供两种类型的接口: 1) S3:兼容Amazon S3RESTful API: ...

  10. bash之管线命令

    命令的输出需要经过好几道手续才能得到我们想要的格式,需要用到管线(pipe),(|) 管线命令(|)仅能处理stdandard output,对stdandard error output会忽略 管线 ...