2021SC@SDUSC
概述
本周我学习了amis
中用作异步请求的处理库Async
,其拥有很强大的功能。
在之前的对于异步请求的操作,包括串行与并行,我一般使用层层回调递归的方式,倘若在串行执行时,异步的任务过多就会形成我们常说的死亡递归,这样的代码不好理解的同时极难维护;在学习了ES6
之后,我又常采用async/await
的方法,虽说很容易实现串行执行,在并行执行又有很大的限制;两者结合起来只会使结构更加臃肿。因此,在Async
中就给出了很好的解决方案。
以下是我总结的常用的Acyns
中常用的方法:
常用函数
apply
想想这种情况,对于一个函数,含有若干个参数,在某一段时间内,该函数的前许几个参数总是保持着同样的值,若是对于该函数有较多次数的调用,是不是每一次都需要传入这些相同值,相对来是比较麻烦的。而apply
就是一个非常好用的函数,可以让我们给一个函数预绑定多个参数并生成一个可直接调用的新函数。
function inc(a,b,callback,timeout){
var timeout = timeout || 200;
t.wait(200);
setTimeout(function() {
callback(null, a+b);
}, timeout);
}
// inc 的前两个参数 a,b 若保持不变,故提前传参,并生成新的调用函数
var fn = async.apply(inc, 1, 2);
fn(function(err, n){
log('1.2 inc: ' + n);
}); // 后续只需要参入还未有的参数
applyEach | applyEachSeries
是apply
的扩展,同时处理多个类似的函数。同时为多个拥有相同参数值的函数传入参数,并且将产生的结果收集一起给回调函数。
applyEach(fns, args..., callback)
fns 是所有需要执行的函数的集合,有用同样的参数形式,fn(inputs,callback)
,且callback
必须使用到。
args是提前给所有函数的前若干参数
callback是所有函数运行完毕后再运行的,callback(err,values)
,其中,values
是每个函数产生的结果,按位次顺序的数组类型。
applyEachSeries
与它的区别是串行执行的
let f = async.applyEach(
[
function (name, cb) {
setTimeout(function () {
log('1.1 handler: ' + name + ' A');
cb(null, name); // 必须使用,传回 name
}, 500);
},
function (name, cb) {
setTimeout(function () {
log('1.1 handler: ' + name + ' B');
cb(null, name);
}, 150);
},
],
'Hello'
);
f(function (err, values) {
log(