说我有一个数组和一个函数A:
var array = ['a', 'b', 'c'];
function A(p) { ... };
现在我想将array
的每个项目传递给函数A
,并希望它们按顺序执行。通常不会有任何问题。我能做到:
array.forEach(function(item) {
A(item);
}
但是,如果A
中有一些异步操作,一切都会搞砸。所以问题是:
即使A中有异步操作,我怎样才能让它们有序执行?
我的意思是,我希望A(&#39; b&#39;)在A(&#39; a&#39;)完全结束后执行(包括其中的所有异步操作)。< / p>
我想一定有一些公用事业公司已经在做这些事了。有人能给我一些启示吗?
答案 0 :(得分:7)
这是来自async.js
的“eachSeries”的完美用例你可以这样使用它
async.eachSeries(array, A, function(err) {
// this function gets called at the end
// after your array has been looped
});
你必须使用第二个参数修改你的A函数 - 回调。
function A(p, callback) {
// ...
return callback();
}
一旦A中的异步调用完成,它就会调用callback参数。
答案 1 :(得分:3)
JavaScript Promises允许您这样做。
这个例子非常复杂,但它显示了使用Promises的一些方面:
var arr = ['a', 'b', 'c'];
function processAsync(val) {
return new Promise(function(res, rej) {
console.log("Starting:", val);
setTimeout(function () {
console.log("Done:", val);
res();
}, 1000);
});
}
arr.reduce(function(promise, i) {
return promise.then(processAsync.bind(null, i));
}, Promise.resolve());
&#13;
答案 2 :(得分:0)
var array = ['a', 'b', 'c'],i = 0;
var A = function(p){
//some code
$.ajax({
success:function(){
try{
A(item[++i]);
}catch{
return;
}
}
});
}
你的意思是?