简介
Async是一个流程控制工具包,提供了直接而强大的异步功能
应用场景
业务流程逻辑复杂,适应异步编程,减少回调的嵌套
安装
npm insatll async
函数介绍
- Collections
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: Jack 103 // 42.460> 1.4 handle: Jack 104 // 42.460> 1.4 err: myerr 105 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: Jack 119 // 42.248> 1.5 enter: Mike 120 // 42.351> 1.5 handle: Mike 121 // 42.352> 1.5 enter: Freewind 122 // 42.461> 1.5 handle: Jack 123 // 42.664> 1.5 handle: Freewind 124 // 42.664> 1.5 err: undefined 125 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: Jack 141 // 42.248> 1.6 enter: Mike 142 // 42.352> 1.6 handle: Mike 143 // 42.462> 1.6 handle: Jack 144 // 42.462> 1.6 err: myerr