Return 在一个循环中解决所有承诺后的值
Return value after all promises are resolved within a loop
给定此 ID 数组:
var array = [1,2,3,4,5];
在循环中进行的所有其他调用完成后,我如何return promise?
var deferred = $q.defer(),
result = [];
for (var i = 0; i < array.length; i++) {
var id = array[i];
Tools.remove(campaignID).then(function(result) {
result.push(result.id);
}).catch(function (response) {
result.push(response)
});
}
deferred.resolve(result);
return deferred.promise;
我假设您实际上并不想 return 在完成所有任务后做出承诺,但是 resolve它。
您可能必须实施一些自定义机制来跟踪未完成的异步调用的数量。最简单的是一个简单的整数计数器:每次分派异步调用时递增它,每次异步调用 returns 时递减它。如果在 returning 时,任何异步调用都找到 0,则可以断定这是对 return 的最后一次异步调用,并可以触发下一步执行。
您的代码示例:
var asyncCount = 0;
for (var i = 0; i < array.length; i++) {
var id = rows[i];
asyncCount++;
Tools.remove(campaignID).then(function(result) {
result.push(result.id);
asyncCount--;
if(asyncCount === 0) nextStep();
});
}
如果您担心混合责任,您可以将它变成某种异步管理器 class。
我会这样做:D
var arrayOfIds = [1,2,3,4,5];
var results = [];
var mySingleDeferred = new $.Deferred();
var arrayOfDeferreds = $.map(arrayOfIds, function(campaignID){
var deferredForThisOperation = Tools.remove(campaignID);
deferredForThisOperation.done(function(result) {
results.push(result.id);
}).catch(function (response) {
results.push(response)
});
return deferredForThisOperation;
});
$.when(arrayOfDeferreds).then(function(){
mySingleDeferred.resolve(results);
});
return mySingleDeferred.promise();
您正在寻找 $q.all
,它等待一系列承诺。
我会这样做:
return $q.all(array.map(Tools.remove)).then(function(results){
return results.map(function(result){ return result.id; });
});
其他答案实现了您从 JavaScript 免费获得的东西或已经承诺的东西 - 并且大部分都有 anti-patterns。
您只需将每个项目映射到 Tools.remove
,等待它 - 获取 ID 并 return 它们。
给定此 ID 数组:
var array = [1,2,3,4,5];
在循环中进行的所有其他调用完成后,我如何return promise?
var deferred = $q.defer(),
result = [];
for (var i = 0; i < array.length; i++) {
var id = array[i];
Tools.remove(campaignID).then(function(result) {
result.push(result.id);
}).catch(function (response) {
result.push(response)
});
}
deferred.resolve(result);
return deferred.promise;
我假设您实际上并不想 return 在完成所有任务后做出承诺,但是 resolve它。
您可能必须实施一些自定义机制来跟踪未完成的异步调用的数量。最简单的是一个简单的整数计数器:每次分派异步调用时递增它,每次异步调用 returns 时递减它。如果在 returning 时,任何异步调用都找到 0,则可以断定这是对 return 的最后一次异步调用,并可以触发下一步执行。
您的代码示例:
var asyncCount = 0;
for (var i = 0; i < array.length; i++) {
var id = rows[i];
asyncCount++;
Tools.remove(campaignID).then(function(result) {
result.push(result.id);
asyncCount--;
if(asyncCount === 0) nextStep();
});
}
如果您担心混合责任,您可以将它变成某种异步管理器 class。
我会这样做:D
var arrayOfIds = [1,2,3,4,5];
var results = [];
var mySingleDeferred = new $.Deferred();
var arrayOfDeferreds = $.map(arrayOfIds, function(campaignID){
var deferredForThisOperation = Tools.remove(campaignID);
deferredForThisOperation.done(function(result) {
results.push(result.id);
}).catch(function (response) {
results.push(response)
});
return deferredForThisOperation;
});
$.when(arrayOfDeferreds).then(function(){
mySingleDeferred.resolve(results);
});
return mySingleDeferred.promise();
您正在寻找 $q.all
,它等待一系列承诺。
我会这样做:
return $q.all(array.map(Tools.remove)).then(function(results){
return results.map(function(result){ return result.id; });
});
其他答案实现了您从 JavaScript 免费获得的东西或已经承诺的东西 - 并且大部分都有 anti-patterns。
您只需将每个项目映射到 Tools.remove
,等待它 - 获取 ID 并 return 它们。