在SO Deferred in $.when while looping an array
中扩展此问题我有这种控制结构: -
function oldSync(array) {
var output = []; // to store the output
$.each( array, function(key,value) { // runs sequentially
var item1 = SyncFunction_A(input);
var item2 = SyncFunction_B(input);
output.push({'a': item1, 'b': item2});
});
return doSomething(output); // process all output
}
接下来,我用AsyncFunction()替换了SyncFunction(),
问题:如何将其转换为延迟或异步功能?
function newAync(array) { //
var output = [];
$.each( array, function(key,value) { // runs sequentially
var item1 = AsyncFunction_A(input);
var item2 = AsncFunction_B(input);
item1.then(item2).then(function(data) {
output.push({'a': data[0], 'b': data[1] });
}
});
return doSomething(output); // FAIL, it doesn't wait for Async
}
答案 0 :(得分:1)
实际上,我更喜欢检查沙箱中的代码。但我希望你能抓住主要想法
function newAync(array) { //
var output = [],
promises = [];
$.each( array, function(key,value) { // runs sequentially
var item1 = AsyncFunction_A(input);
var item2 = AsncFunction_B(input);
var promise = item1.then(item2).then(function(data) {
output.push({'a': data[0], 'b': data[1] });
};
promises.push(promise);
});
var defer = $.Deferred();
$.when.apply($, promises).done(function() {
defer.resolve(doSomething(output));
});
return defer.promise();
}
答案 1 :(得分:1)
您需要做的是利用回调函数来使用同步功能。我不知道你的A和B函数是什么,他们想要做什么,或者那些值代表你存储在output
数组中的那些。
这是一个将url数组传递给函数的示例,当你获得每个url的结果时它会执行回调:
function func(urls_array, callback){ // The "callback" will be called when all results have returned.
var results = []; // Array to store the results of each $.get
for(var i=0;i<urls_array.length;i++){ // Loop through each url
$.get(urls_array[i], function(x){ // get the data at the url
results.push(x); // store the results of this get function
if(results.length == urls_array.length){ // If all urls have returned
callback(results); // execute the callback function letting it know that you have finished
}
});
}
}
这可能有助于您了解同步功能(回调函数)的工作原理。
如果您希望对问题稍微具体一点,我们可以提供可能有用的答案,但您提出的问题过于通用,也可能没有为我们定义SyncFunction_A
之类的内容。< / p>