async 之流程控制
之前的老文章，换了个地方写博客，，所以得重新发布下~~
# Control Flow

async是Nodejs中非常常用的一个工具模块，其中方法有很多，主要分3大类（集合，流程控制，工具），下面就简单说说 **流程控制** 的一些常用方法
### series(tasks, [callback])

它的作用就是按照顺序依次执行。

``` javascript
async.series({
    one: function(callback){
        callback(null, 1);
    },
    two: function(callback){
        callback(null, 2);
    }
},function(err, results) {
    console.log(results);
});
```

输出 { one: 1, two: 2 }

``` javascript
async.series([
    function(callback){
        callback(null, 1);
    },
    function(callback){
        callback(null, 2);
    }
],function(err, results) {
    console.log(results);
});
```

输出 [ 1, 2 ]

上面写出两个，是因为series方法的第一个参数可以是一个数组也可以是一个对象，参数类型不同，callback 参数返回的值也不同。
### waterfall(tasks, [callback])

waterfall和series函数有很多相似之处，都是按照顺序执行。
不同之处是waterfall每个函数产生的值，**都将传给下一个函数**，而series则没有这个功能，示例如下：

``` javascript
async.waterfall([
    function(callback){
        callback(null, 'one', 'two');
    },
    function(arg1, arg2, callback){
        // arg1 now equals 'one' and arg2 now equals 'two'
        callback(null, 'three');
    },
    function(arg1, callback){
        // arg1 now equals 'three'
        callback(null, 'done');
    }
], function (err, result) {
   // result now equals 'done'
   console.log(result);
});
```

另外需要注意的是 waterfall 的 tasks 参数只能是 **数组** 类型。
### parallel(tasks, [callback])

parallel函数是并行执行多个函数，每个函数都是立即执行，不需要等待其它函数先执行。
传给最终callback的数组中的数据按照tasks中声明的顺序，而不是执行完成的顺序，示例如下：

``` javascript
async.parallel([
    function(callback){
        callback(null, 'one');
    },
    function(callback){
        callback(null, 'two');
    }
],function(err, results){
    console.log(results); // [ 'one', 'two' ]
});
```

和series函数一样，tasks参数可以是一个 **数组** 或 **对象**，tasks参数类型不同，返回的results格式也会不一样。
### parallelLimit(tasks, limit, [callback])

parallelLimit函数和parallel类似，但是它多了一个参数**limit**。
limit参数限制任务只能同时并发一定数量，**而不是无限制并发**，示例如下：

``` javascript
async.parallelLimit([
    function(callback){
        callback(null, 'one');
    },
    function(callback){
        callback(null, 'two');
    }
],2,function(err, results){
    console.log(results); // [ 'one', 'two' ]
});
```

以上是一些我个人比较常用的方法，还有一些其他不怎么常用的方法，建议去github看[更多详细信息](https://github.com/caolan/async)，不过是英文的哦~
