Async.js用来处理异步的调用

在官方网站中,是这样介绍的,这是一个用来处理异步js的工具包。它提供了一些直观的,功能强大的函数。尽管它最初是为node.js来设计的,它也可以直接用在browser中。

先来看一段代码(需要在nodejs中运行):

View Code
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是如何来实现的:

View Code
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, 另一个是同时能处理的任务的个数:

View Code
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

posted @ 2013-02-27 17:40  moonreplace  阅读(3690)  评论(0编辑  收藏  举报