Javascript角度链的承诺在for循环中

时间:2016-10-07 15:24:23

标签: javascript angularjs promise

我希望执行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循环的结果,但是没有返回(警报未打印,因此不会到达那里)。有什么想法吗?

5 个答案:

答案 0 :(得分:2)

您可以利用Breadth-First-Search(Graph, root): 2 3 for each node n in Graph: 4 n.distance = INFINITY 5 n.parent = NIL 6 7 create empty queue Q 8 9 root.distance = 0 10 Q.enqueue(root) 11 12 while Q is not empty: 13 14 current = Q.dequeue() 15 16 for each node n that is adjacent to current: 17 if n.distance == INFINITY: 18 n.distance = current.distance + 1 19 n.parent = current 20 Q.enqueue(n) 返回承诺的方式:

$q

例如:

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

此代码将返回要解析的数组中所有promisses的promisse。

答案 1 :(得分:2)

问题:

  1. 你在循环的每次迭代中覆盖promise ...所以只有一个promise
  2. 没有决心永远触发then(),因此数组将始终为空
  3. 你在循环中有一个return所以循环会在第一次迭代时中断并且永远不会完成
  4. 如果这是异步的,i将不会是您认为它在then()内的内容,因为它会在承诺结算之前到达它
  5. 我认为没有必要在代码中写这个,因为你所做的一切都是同步的,并且首先不需要承诺

答案 2 :(得分:0)

好的还要感谢@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
     })
}

基本上我忘记了决心。

答案 3 :(得分:0)

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

使用$.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 Service API Reference -- chaining promises

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

答案 4 :(得分:0)

你的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));
})