Javascript 在循环中解析所有承诺后返回值
给定此IDs阵列:Javascript 在循环中解析所有承诺后返回值,javascript,promise,Javascript,Promise,给定此IDs阵列: var array = [1,2,3,4,5]; 在循环中进行的所有其他调用完成后,如何返回承诺 var deferred = $q.defer(), result = []; for (var i = 0; i < array.length; i++) { var id = array[i]; Tools.remove(
var array = [1,2,3,4,5];
在循环中进行的所有其他调用完成后,如何返回承诺
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;
var deferred=$q.deferred(),
结果=[];
对于(var i=0;i
我想,当你的所有任务都完成时,你实际上并不想回报一个承诺,而是要解决它
您可能必须实现一些自定义机制来跟踪未完成异步调用的数量。最简单的是一个简单的整数计数器:每次调度异步调用时递增,每次异步调用返回时递减。如果在返回时,任何异步调用都发现0,则可以断定这是最后一个要返回的异步调用,并可以触发下一步执行
代码示例:
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();
});
}
var asyncCount=0;
对于(var i=0;i
如果您担心混合责任,可以将其转换为某种异步管理器类。我将这样做: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或承诺中免费获得的东西,而且大部分都是这样
您只需将每个项目映射到
工具。删除,等待它-获取ID并返回它们 为什么要延迟反模式?假设这是一个方法,并且您希望在所有黑盒垃圾的末尾提供一个结果。。。然后我会回报一个承诺,而不是一系列的延迟。。。如果这段代码只是最后一个前端块(没有调用方),那么是的,只需一次等待即可。。。如果你真的理解了,反模式是为每个已经存在的承诺创建一个新的延迟。你可以返回你$。当调用时-不需要包装它。只要返回$。when(arrayOfDeferred
-或者更好-不要创建延迟数组,只需将此操作的承诺从延迟推送到数组。此时,您只需将arrayOfId
映射到工具。像我的答案中那样删除,并$。when
将其删除即可(顺便说一句,你的意思是$。当.apply($)时,array
,因为它需要varargs,而且-OP没有使用jQuery。你真的映射了一个函数吗?@AdrianSalazar是的,工具。remove
是一个函数,数组#map
获取数组中的每一项并对其调用函数。因此数组.map(Tools.remove)
与调用工具相同。在数组的每一项上删除,并将结果推送到一个新数组中。请看一个不错的数组。每天你都会学到一些新的东西……只需说明map在每个浏览器上都不起作用。现在如何解决“返回值”的问题(他说promise,因为他懂异步)在所有异步操作完成后…为了将您置于这里的上下文中,您在一个方法中…@AdrianSalazar它在IE8之后的每个浏览器上都可以工作,并且可以在IE8中多填充。因为OP使用AngularJS($q此处)很可能他根本不支持IE8。我使用的方法-$q.all
就是这样做的-它接受一系列承诺并返回一个承诺,当所有这些承诺都完成时,这个承诺就完成了-这是$。在jQuery中。@BenjaminGruenbaum我已经阅读了你发布的各种链接,但有一点我仍然不确定。这将返回一个承诺解析后将返回一个Id数组。如果任何单个承诺失败,则Id将只是未定义的。在函数中创建并返回一个新承诺不是更好吗?这样,如果任何单个承诺失败,您就可以拒绝返回承诺并产生有意义的错误,而不仅仅是设置“未定义”?