1

我正在尝试使用 for 循环顺序调用一系列承诺,但我无法以正确的顺序工作。从理论上讲,控制台应该记录第一个块,但它会记录第二个块(这意味着所有的 Promise 都被同时调用,而第二个 Promise 只在第一个之后被调用)。

我认为这可能与此链接相似,但我认为我是在声明函数而不是在 then 声明中调用它? 如何在 Javascript 中使用 Q 顺序运行 Promise?

预期输出:

starting: 3 
ending: 3
starting: 2 
ending: 2
starting: 1  
ending: 1 

实际输出:

starting: 3 
starting: 2 
starting: 1 
ending: 1 
ending: 2 
ending: 3 

http://jsfiddle.net/4k6t9/3/

var app = angular.module('myApp', []);
app.controller('MyCtrl', function($scope, $q, $timeout) { 
   var temp = $q.when({});
   var arr = [3, 2, 1];

    arr.forEach(function(element) {
        temp = temp.then(delay(element));
    })

    function delay(timing) {
        var deferred = $q.defer();
        console.log('starting: ' + timing)
        $timeout(function() {
            console.log('ending: ' + timing);
            deferred.resolve(timing);
        }, timing * 1000);
        return deferred.promise;
    }
});
4

1 回答 1

4

您的小提琴与问题中的代码略有不同。但你几乎在那里。只缺少一份退货声明。

你是对的:temp = temp.then(delay(element));电话delay。相反,您想要的是返回一个将调用delay. (你把它放在了小提琴里。)

唯一缺少的是return返回它:)

这是工作小提琴:http: //jsfiddle.net/4k6t9/6/

于 2013-09-04T08:21:00.420 回答