繁体   English   中英

for循环中的Javascript承诺角​​链

[英]Javascript angular chain of promises in for loop

我希望将执行for循环,然后将结果通过下一个函数发送:

FindIdsRequests =  function(){
    results = $scope.requests
    var deferred = $q.defer();
    var promise = deferred.promise;
    var array = []
    for (var i in results) {
        promise = promise.then(function(){
            array.push(results[i].uid)      
        })
        return promise
    }
    return promise.then(function(){
        return array
    })
}

$scope.ConfirmRequests = function(){
    //alert('req'+JSON.stringify($scope.requests))
    FindIdsRequests().then(function(array){
        alert('arr'+JSON.stringify(array))
    })
})

FindIdsRequests函数应该返回for循环的结果,但是没有返回(警报没有打印出来,所以没有到达那里)。 任何想法?

您可以利用$q优点来返回承诺,如下所示:

$q.all([promise1, promise2]);

例如:

FindIdsRequests =  function(){

    var requests = $scope.requests;
    var results = [];    
    var array = [];

    for (var i in requests) {

        var req = $http.get('http://someUrl.com/' + requests[i].uid);

        array.push(req);

        req.then(function (response) {
            results.push(response.data);
        });
    }

    return $q.all(array).then(function(){
        return results;
    });
}

此代码将返回要解决的数组中所有许可的许可。

问题:

  1. 您将要覆盖promise在每个循环迭代...所以永远只能一个promise
  2. 永远无法触发then()的诺言解析,因此数组将始终为空
  3. 您在循环中有return ,因此循环将在第一次迭代时中断并且永远不会完成
  4. 如果这是异步i不会是你认为它是内部then()因为它会已承诺结算前,达到它的结束

我认为无需在代码中编写代码,因为您所做的一切都是同步的,并且一开始就不需要承诺

好的,还要感谢@charlietlf的注释,以下代码有效:

FindIdsRequests =  function(){

    results = $scope.requests
    var deferred = $q.defer();
    var promise = deferred.promise;
    var array = []
    for (var i in results) {
        alert('www'+JSON.stringify(results[i].uid))
        var obj = results[i].uid
        promise = promise.then(function(){
            array.push(results[i].uid)      
        })
        //return promise
    }
    deferred.resolve(array)
    return promise.then(function(){
            alert('ee'+JSON.stringify(array))
            return array
     })
}

本质上,我忘了下决心了。

从一系列承诺中创建承诺链

在创建空承诺时使用$.when ,并使用for循环创建链:

function chainPromiseArray(promiseArray){
    var promise = $q.when();
    var array = [];
    for (var i=0;  i < promiseArray.length; i++) {
        promise = promise.then(function(){
            var derivedPromise = promiseArray[i].then(function(result) {
                //push data
                array.push(result.data);
            });
            //return promise to chain
            return derivedPromise;
        });
    };
    var finalPromise =  promise.then(function(){
        return array;
    });
    return finalPromise;
};

上面的示例以一个空的承诺开始,然后从该空的承诺中进行链接。 最终的承诺将解决链所创建的数组。

连锁承诺

因为调用promise的.then方法会返回新的派生promise,所以很容易创建promise的链。 可以创建任何长度的链,并且由于一个承诺可以用另一个承诺来解决(这将进一步推迟其解决方案),因此可以在链中的任何点暂停/推迟对承诺的解决。 这样就可以实现功能强大的API。

-AngularJS $ q服务API参考-链接承诺

该示例按顺序执行promise。 要并行执行承诺,请使用$ q.all方法

如图所示,您的FindIdsRequests()函数在代码中没有异步元素,因此它可以只是一个同步函数,实际上,尝试在其中使用Promise只是使一个非常简单的操作变得复杂:

// get an array of uid from $scope.requests
function FindIdsRequests() {
    return $scope.requests.map(function(item) {
        return item.uid;
    });
});

$scope.ConfirmRequests = function() {
    var ids = FindIdsRequests();
    console.log('arr: '+ JSON.stringify(ids));
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM