用async 解放你的大脑
在js中,代码嵌套和代码回调非常常见,不仅编写麻烦而且异常反人类。让我等码农很是头痛
function () { function () { function () { function () { //pass } } }} |
这是一个常规的嵌套,如果每个function 的逻辑处理都比较多的话,会导致整个代码非常长,不仅编码困难,而且阅读起来也是很是蛋疼, 这种情况在js 中还是比较好的情况 ,还有非常恶劣的情况 ,考虑下在 异步嵌套的情况
var path = './async.txt';// check if async.txt existsfs.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 解放你的大脑的更多相关文章
- Java To CSharp源代码转换
前言 开发环境 客户端:Unity3D开发(C#) 服务器:Java (基于Java7) 日 期:2016年09月 需求说明 部分服务器的部分逻辑功能在客户端实现一遍,可以简单的理解为服务器的部分 ...
- 初识java这个小姑娘(二)
妙解垃圾回收机制 周一,早高峰. 一段考验一个人耐力.智力.开车技术以及脾气的路. 我把车开进了一个没有红绿灯的丁字路口,然后就没有然后了. 来自三个方向的大车小车开始在不大的一块空间里开始互相斗智斗 ...
- 每个程序员都可以「懂」一点 Linux
提到 Linux,作为程序员来说一定都不陌生.但如果说到「懂」Linux,可能就没有那么多人有把握了.到底用 Linux 离懂 Linux 有多远?如果决定学习 Linux,应该怎么开始?要学到什么程 ...
- CQRS学习——Cqrs补丁,async实验以及实现[其二]
实验——async什么时候提高吞吐 async是一个语法糖,用来简化异步编程,主要是让异步编程在书写上接近于同步编程.总的来收,在await的时候,相当于附加上了一个.ContinueWith(). ...
- 【译】异步JavaScript的演变史:从回调到Promises再到Async/Await
我最喜欢的网站之一是BerkshireHathaway.com--它简单,有效,并且自1997年推出以来一直正常运行.更值得注意的是,在过去的20年中,这个网站很有可能从未出现过错误.为什么?因为它都 ...
- 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 ...
- ES2017 中的 Async 和 Await
ES2017 在 6 月最终敲定了,随之而来的是广泛的支持了我最喜欢的最喜欢的JavaScript功能: async(异步) 函数.如果你也曾为异步 Javascript 而头疼,那么这个就是为你设计 ...
- AI+教育落地,百度大脑如何让校园更智能?
人工智能作为影响社会底层技术革命逐渐向传统行业渗透,“AI+”已经替代“互联网+”成为创业创新的新引擎,出人意料的是,在AI在教育业的率先落地并且相当火爆. 现在,人工智能教育已成为从业者心目中的“教 ...
- js中异步方案比较完整版(callback,promise,generator,async)
JS 异步已经告一段落了,这里来一波小总结 1. 回调函数(callback) setTimeout(() => { // callback 函数体 }, 1000) 缺点:回调地狱,不能用 t ...
随机推荐
- ArcGIS制图表达Representation实战篇4-自由式制图表达
ArcGIS制图表达Representation实战篇4-自由式制图表达 by 李远祥 上一章节关于制图表达的控制点中已经介绍过制图表达的编辑功能,利用制图表达的编辑功能,可以实现一些规则以外的效果. ...
- C语言 memcpy二维数组的复制
今天在实现二维数组的复制功能时,竟然出现了好多问题,还是太不小心了. 我们知道,平时进行矩阵复制,无非是二重循环进行赋值操作,所以今天想改用利用memcpy进行复制操作,当然一维数组的复制在上一篇文章 ...
- python中的select模块
介绍: Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqu ...
- kali linux live(persistence)+PE+windows7安装多启动菜单优盘制作
需要以下工具: 下载链接: 一.制作kali linux persistence 将32GU盘格式化为FAT32格式,使用win32diskimager将kalilinux镜像写入优盘,占用优盘3.4 ...
- python2.6.6安装MySQL-python模块正确方法
Centos6.5 x64 系统python2.6.6安装MySQL-python模块 一.安装前准备 操作系统:centos6.5 x64 ·安装python和python开发工具 python p ...
- NSInternalInconsistencyException attempt to delete row 2 from section 4 which only contains 0 rows before the update 问题原因
insertRowsAtIndexPaths 和 deleteRowsAtIndexPaths 同 numberOfRowsInSection 的关系 如果不处理好这个关系,大概所有的问题都是这样的: ...
- noi 1.8 11图像旋转
水题不解释 其实我偷懒了 直接输出,,,,,,, 个人QQ:757394026团队QQ:466373640个人博客:www.doubleq.winc++/noi/信息学奥数博客:http://www. ...
- 强化学习读书笔记 - 02 - 多臂老O虎O机问题
# 强化学习读书笔记 - 02 - 多臂老O虎O机问题 学习笔记: [Reinforcement Learning: An Introduction, Richard S. Sutton and An ...
- ZOJ 1492 Maximum Clique 搜索最大团
ZOJ1492 题意:给一个无向图 求最大团的大小.节点数小于50 数据有限,考虑记忆化搜索,方程很好给出. 令 Si={vi,vi+1.....vn} mc[i]表示Si最大团的大小,倒着推算. 必 ...
- 自定义view(二)
这里是自定义view(二),上一篇关于自定义view的一些基本知识,比如说自定义view的步骤.会涉及到哪些函数以及如何实现自定义属性,同时实现了一个很基础的自定义控件,一个自定义的计时器,需要看的人 ...