简介

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

相关文章:

  • 2021-09-19
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-16
  • 2020-05-10
猜你喜欢
  • 2021-12-30
  • 2021-08-05
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案