上面的集合类是对一个集合进行相同的处理,集合中的每一项都处理完后,再对结果进行回调处理。而多个回调方法执行时,则需要对这几个回调方法进行控制了。
多个回调方法执行时,通常有这么几个流程:
串行且无关联,即执行完一个后再依次执行下一个,且相互之间无数据交互,都执行完后,再执行最后的回调函数。可以使用async.series
串行且有关联,即执行完一个后再依次执行下一个,且上一个回调函数的结果会作为下一个回调函数的参数。可以使用async.waterfall
并行,这几个回调函数同时并发执行,都执行完成后,再执行最后的回调函数。可以使用async.parallel
当然还有其他更复杂的流程,这里也只聊上面的三种情况。
async.series,async.waterfall和async.parallel的语法都是一样的: async.Method(coll, function(err, results){ })
其中coll既可以是数组,也可以是json格式的,而且results的类型与coll对应。
串行且无关联async.series:
// 串行且无关联,数组格式 async.series([ function(cb){ getAllList(function(result){ cb(null, result); }); }, function(cb){ getAllUser(function(result){ cb(null, result); }); } ], function(err, result){ console.log(result); })
同时串行的异步可以是json格式的:
// 串行且无关联,json个数 async.series({ one: function(cb){ getAllList(function(result){ cb(null, result); }); }, two: function(cb){ getAllUser(function(result){ cb(null, result); }); } }, function(err, result){ console.log(result); })
串行且有关联async.waterfall:
// 串行且上一个结果作为下一个的参数 async.waterfall([ function(cb){ getListById(1, function(result){ cb(null, result); }); }, function(params, cb){ console.log(params); getAllUser(function(result){ cb(null, result); }); } ], function(err, result){ console.log(result); })
并行async.parallel:
// 并行,getAllList与getAllUser同时执行 async.parallel([ function(cb){ getAllList(function(result){ cb(null, result); }); }, function(cb){ getAllUser(function(result){ cb(null, result); }); } ], function(err, result){ console.log(result); })
关于并行的异步操作,这里还有一个async.parallelLimit,限制并发的数量:
// 并发数量为2 async.parallelLimit([ iteratee1, iteratee2, iteratee3, ... ], 2, function(err, results){ })
2.3 工具类
async中也提供了不少的工具方法可供使用,比如async.log可以输出回调方法中的值,第1个参数为函数,后面的参数为传递给函数的参数:
var hello = function(name, callback) { setTimeout(function() { callback(null, 'hello ' + name); }, 1000); }; // 将'world'传递给hello方法 async.log(hello, 'world'); // 'hello world'
这里面还有apply, dir, timeout等方法。
总结
使用async控制异步流程非常的方便,而且也可以在前端使用,比如可以操作多个ajax请求等。好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
您可能感兴趣的文章: