我有一个异步函数将它的回调分解为一个对象success
和error
,这个函数需要一个参数(除了回调)"pink"
。
async("pink",{
success:function(){
},
error:function(){
}
});
我想创建此函数的复数版本,该函数接收数组并返回true
操作的false
或async
值。
asyncs(["blue","red","green"],function(values){
console.log(values); // [true,true,true];
});
诀窍是每个acync
行动都需要在下一个行动中,函数(true
或false
)的值需要pushed()
成为“全局“(范围更高)变量values
以及最后在主callback(values)
中返回(当count
到达数组length
时)
这是嵌套每个async()
函数并返回values
的非常基本的方法,它是有限的,因为它只手动跟踪3
数组值。
var asyncs = function(params,mstrCB){
var length = params.length;
var values = [];
async(param[0],{
success:function(){
values.push(true);
async(param[1],{
success:function(){
values.push(true);
async(param[2],{
success:function(){
values.push(true);
mstrCB(values);
},
error:function(){
values.push(false);
mstrCB(values);
}
});
},
error:function(){
values.push(false);
mstrCB(values);
}
});
},
error:function(){
values.push(false);
mstrCB(values);
}
});
};
答案 0 :(得分:1)
使用计数器而不是手动嵌套。将请求放在自己的函数中,然后在每个success
上,递增计数器,如果它小于length
,则发出新请求。
i === length
时,请致电mstrCB()
。
var asyncs = function(params,mstrCB){
var length = params.length;
var values = [];
var i = 0;
if (length)
makeRequest();
function makeRequest() {
async(params[i], {
success:function(){
values.push(true);
// Increment the counter
i++;
if (i === length) // we're at the end
mstrCB(values);
else
makeRequest(); // there's still more, so make another request
},
error:function(){
values.push(false);
mstrCB(values);
}
});
}
};