Javascript 在循环中解析所有承诺后返回值

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(

给定此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(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将只是未定义的。在函数中创建并返回一个新承诺不是更好吗?这样,如果任何单个承诺失败,您就可以拒绝返回承诺并产生有意义的错误,而不仅仅是设置“未定义”?