Async是一个流程控制工具包,提供了直接而强大的异步功能
业务流程逻辑复杂,适应异步编程,减少回调的嵌套
npm insatll async
each: 如果想对同一个集合中的所有元素都执行同一个异步操作。
1 var async = require('async'); 2 3 var t = require('./t'); 4 var log = t.log; 5 6 /** 7 * 8 * async提供了三种方式: 9 * 1. 集合中所有元素并行执行 10 * 2. 一个一个顺序执行 11 * 3. 分批执行,同一批内并行,批与批之间按顺序 12 * 13 * 如果中途出错,则错误将上传给最终的callback处理。其它已经启动的任务继续执行,未启动的忽略。 14 */ 15 // each(arr, iterator(item, callback), callback(err)) 16 17 18 var arr = [{name:'Jack', delay: 200}, 19 {name:'Mike', delay: 100}, 20 {name:'Freewind', delay: 300}]; 21 22 /** 23 * 所有操作并发执行,且全部未出错,最终得到的err为undefined。注意最终callback只有一个参数err。 24 */ 25 // 1.1 26 async.each(arr, function(item, callback) { 27 log('1.1 enter: ' + item.name); 28 setTimeout(function(){ 29 log('1.1 handle: ' + item.name); 30 callback(null, item.name); 31 }, item.delay); 32 }, function(err) { 33 log('1.1 err: ' + err); 34 }); 35 // 输出如下: 36 // 42.244> 1.1 enter: Jack 37 // 42.245> 1.1 enter: Mike 38 // 42.245> 1.1 enter: Freewind 39 // 42.350> 1.1 handle: Mike 40 // 42.445> 1.1 handle: Jack 41 // 42.554> 1.1 handle: Freewind 42 // 42.554> 1.1 err: undefined 43 44 45 /** 46 * 如果中途出错,则出错后马上调用最终的callback。其它未执行完的任务继续执行。 47 */ 48 async.each(arr,function(item, callback) { 49 log('1.2 enter: ' +item.name); 50 setTimeout(function() { 51 log('1.2 handle: ' + item.name); 52 if(item.name==='Jack') { 53 callback('myerr'); 54 } 55 }, item.delay); 56 }, function(err) { 57 log('1.2 err: ' + err); 58 }); 59 // 输出如下: 60 // 42.246> 1.2 enter: Jack 61 // 42.246> 1.2 enter: Mike 62 // 42.246> 1.2 enter: Freewind 63 // 42.350> 1.2 handle: Mike 64 // 42.445> 1.2 handle: Jack 65 // 42.446> 1.2 err: myerr 66 // 42.555> 1.2 handle: Freewind 67 68 /** 69 * 与each相似,但不是并行执行。而是一个个按顺序执行。 70 */ 71 async.eachSeries(arr, function(item, callback) { 72 log('1.3 enter: ' + item.name); 73 setTimeout(function(){ 74 log('1.3 handle: ' + item.name); 75 callback(null, item.name); 76 }, item.delay); 77 }, function(err) { 78 log('1.3 err: ' + err); 79 }); 80 // 42.247> 1.3 enter: Jack 81 // 42.459> 1.3 handle: Jack 82 // 42.459> 1.3 enter: Mike 83 // 42.569> 1.3 handle: Mike 84 // 42.569> 1.3 enter: Freewind 85 // 42.883> 1.3 handle: Freewind 86 // 42.883> 1.3 err: undefined 87 88 /** 89 * 如果中途出错,则马上把错误传给最终的callback,还未执行的不再执行。 90 */ 91 async.eachSeries(arr,function(item, callback) { 92 log('1.4 enter: ' +item.name); 93 setTimeout(function() { 94 log('1.4 handle: ' + item.name); 95 if(item.name==='Jack') { 96 callback('myerr'); 97 } 98 }, item.delay); 99 }, function(err) {100 log('1.4 err: ' + err);101 });102 // 42.247> 1.4 enter: Jack103 // 42.460> 1.4 handle: Jack104 // 42.460> 1.4 err: myerr105 106 /**107 * 分批执行,第二个参数是每一批的个数。每一批内并行执行,但批与批之间按顺序执行。108 */109 async.eachLimit(arr, 2, function(item, callback) {110 log('1.5 enter: ' + item.name);111 setTimeout(function(){112 log('1.5 handle: ' + item.name);113 callback(null, item.name);114 }, item.delay);115 }, function(err) {116 log('1.5 err: ' + err);117 });118 // 42.247> 1.5 enter: Jack119 // 42.248> 1.5 enter: Mike120 // 42.351> 1.5 handle: Mike121 // 42.352> 1.5 enter: Freewind122 // 42.461> 1.5 handle: Jack123 // 42.664> 1.5 handle: Freewind124 // 42.664> 1.5 err: undefined125 126 /**127 * 如果中途出错,错误将马上传给最终的callback。同一批中的未执行完的任务还将继续执行,但下一批及以后的不再执行。128 */129 async.eachLimit(arr,2,function(item, callback) {130 log('1.6 enter: ' +item.name);131 setTimeout(function() {132 log('1.6 handle: ' + item.name);133 if(item.name==='Jack') {134 callback('myerr');135 }136 }, item.delay);137 }, function(err) {138 log('1.6 err: ' + err);139 });140 // 42.248> 1.6 enter: Jack141 // 42.248> 1.6 enter: Mike142 // 42.352> 1.6 handle: Mike143 // 42.462> 1.6 handle: Jack144 // 42.462> 1.6 err: myerrView Code
map: 对集合中的每一个元素,执行某个异步操作,得到结果。所有的结果将汇总到最终的callback里。与each的区别是,each只关心操作不管最后的值,而map关心的最后产生的值。
1 var async = require('async'); 2 3 var t = require('./t'); 4 var log = t.log; 5 6 /** 7 8 * 提供了两种方式: 9 * 1. 并行执行。同时对集合中所有元素进行操作,结果汇总到最终callback里。如果出错,则立刻返回错误以及已经执行完的任务的结果,未执行完的占个空位 10 * 2. 顺序执行。对集合中的元素一个一个执行操作,结果汇总到最终callback里。如果出错,则立刻返回错误以及已经执行完的结果,未执行的被忽略。 11 */ 12 // map(arr, iterator(item, callback), callback(err, results)) 13 14 var arr = [{name:'Jack', delay:200}, {name:'Mike', delay: 100}, {name:'Freewind', delay:300}, {name:'Test', delay: 50}]; 15 16 /** 17 * 所有操作均正确执行,未出错。所有结果按元素顺序汇总给最终的callback。 18 */ 19 // 1.1 20 async.map(arr, function(item, callback) { 21 log('1.1 enter: ' + item.name); 22 setTimeout(function() { 23 log('1.1 handle: ' + item.name); 24 callback(null, item.name + '!!!'); 25 }, item.delay); 26 }, function(err,results) { 27 log('1.1 err: ', err); 28 log('1.1 results: ', results); 29 }); 30 // 54.569> 1.1 enter: Jack 31 // 54.569> 1.1 enter: Mike 32 // 54.569> 1.1 enter: Freewind 33 // 54.569> 1.1 enter: Test 34 // 54.629> 1.1 handle: Test 35 // 54.679> 1.1 handle: Mike 36 // 54.789> 1.1 handle: Jack 37 // 54.879> 1.1 handle: Freewind 38 // 54.879> 1.1 err: 39 // 54.879> 1.1 results: [ 'Jack!!!', 'Mike!!!', 'Freewind!!!', 'Test!!!' ] 40 41 /** 42 * 如果中途出错,立刻将错误、以及已经执行完成的结果汇总给最终callback。未执行完的将会在结果数组中用占个空位。 43 */ 44 async.map(arr, function(item, callback) { 45 log('1.2 enter: ' + item.name); 46 setTimeout(function() { 47 log('1.2 handle: ' + item.name); 48 if(item.name==='Jack') callback('myerr'); 49 else callback(null, item.name+'!!!'); 50 }, item.delay); 51 }, function(err, results) { 52 log('1.2 err: ', err); 53 log('1.2 results: ', results); 54 }); 55 // 54.569> 1.2 enter: Jack 56 // 54.569> 1.2 enter: Mike 57 // 54.569> 1.2 enter: Freewind 58 // 54.569> 1.2 enter: Test 59 // 54.629> 1.2 handle: Test 60 // 54.679> 1.2 handle: Mike 61 // 54.789> 1.2 handle: Jack 62 // 54.789> 1.2 err: myerr 63 // 54.789> 1.2 results: [ undefined, 'Mike!!!', , 'Test!!!' ] 64 // 54.879> 1.2 handle: Freewind 65 66 /** 67 * 顺序执行,一个完了才执行下一个。 68 */ 69 async.mapSeries(arr, function(item, callback) { 70 log('1.3 enter: ' + item.name); 71 setTimeout(function() { 72 log('1.3 handle: ' + item.name); 73 callback(null, item.name+'!!!'); 74 }, item.delay); 75 }, function(err,results) { 76 log('1.3 err: ', err); 77 log('1.3 results: ', results); 78 }); 79 // 54.569> 1.3 enter: Jack 80 // 54.789> 1.3 handle: Jack 81 // 54.789> 1.3 enter: Mike 82 // 54.899> 1.3 handle: Mike 83 // 54.899> 1.3 enter: Freewind 84 // 55.209> 1.3 handle: Freewind 85 // 55.209> 1.3 enter: Test 86 // 55.269> 1.3 handle: Test 87 // 55.269> 1.3 err: 88 // 55.269> 1.3 results: [ 'Jack!!!', 'Mike!!!', 'Freewind!!!', 'Test!!!' ] 89 90 /** 91 * 顺序执行过程中出错,只把错误以及执行完的传给最终callback,未执行的忽略。 92 */ 93 async.mapSeries(arr, function(item, callback) { 94 log('
新闻热点
疑难解答