Async.js用来处理异步的调用
在官方网站中,是这样介绍的,这是一个用来处理异步js的工具包。它提供了一些直观的,功能强大的函数。尽管它最初是为node.js来设计的,它也可以直接用在browser中。
先来看一段代码(需要在nodejs中运行):
var fs = require('fs'); var async = require('async'); process.chdir('testAsync'); var concatenation = ''; var dirContents = fs.readdirSync('.'); async.filter(dirContents, isFilename, function(filenames){ async.forEachSeries(filenames, readAndContent, onComplete); }); function isFilename(filename, callback){ fs.stat(filename, function(err, stats){ if(err) throw err; callback(stats.isFile()); }); } function readAndContent(filename, callback){ fs.readFile(filename, 'utf8', function(err, fileContents){ if(err) return callback(err); concatenation += fileContents; callback(); }); } function onComplete(err) { if(err) throw err; console.log(concatenation); }
上述的代码需要在当前路径下新那一个foler,命名为testAsync, 并在其中建立几个文本文件,这样我们在nodejs testAsync.js,将会在命令行下,显示这几个文件的内容。
现在让我们来分析一下我们用到了几个函数:
filter, forEach这是async所提供的众多函数中的其中一个,这两个函数和jQuery中的filter,each几乎起到了相同的作用。另外,还有下列的函数:
reject/rejectSeries, 和filter是相反的用法。
map/mapSeries, 1:1的转换,最后返回转化后的数组。
reduce/reduceRight,对于每一项进行处理,上一个处理结果转入下一个新项中
detect/dectectSeries,找出一项
sortBy, some, every
上述只是Async提供的最核心的代码应用之一,我们来看一下它是如何来控制我们流程的:
流程控制:
如果我们用js来实现一个顺序执行的函数,就应该如下所示:
funcs[0](function(){
funcs[1](function(){
funcs[2](onComplete);
});
});
看看Async是如何来实现的:
var async = require('async'); var start = new Date; async.series([ function(callback){setTimeout(callback,100);}, function(callback){setTimeout(callback,300);}, function(callback){setTimeout(callback,200);} ],function(err,results){ console.log('Completed in'+(new Date - start) +'ms'); });
上述结果大概是600ms左右,因为它们是顺序执行的。如果我们把async.series/async.waterfall改为async.parallel时间就会变为300ms左右。
上述两个函数在流程控制方面其实是有很多限制的:
1. 我们无法动态的改变我们的task array.
2.无法查询已经完成了多少功能。
所以async还提供了另外一个函数:async.queue
它会接收两个参数,一个是worker, 另一个是同时能处理的任务的个数:
var async = require('async'); function worker(data, callback){ console.log(data); callback(); } var concurrency = 2; var queue = async.queue(worker, concurrency); queue.push(1); queue.push(2); queue.push(3);
参考资料:
Async Javascript Build More Responsive Apps with less code
https://github.com/caolan/async