Javascript 尝试使用带有顺序承诺(q)的循环时出现的问题

Javascript 尝试使用带有顺序承诺(q)的循环时出现的问题,javascript,angularjs,promise,q,Javascript,Angularjs,Promise,Q,我试图使用for循环按顺序调用一系列承诺,但在以正确的顺序工作时遇到了困难。从理论上讲,控制台应该记录第一个块,而不是记录第二个块(这意味着所有承诺都在同一时间被调用,而第二个承诺只在第一个之后被调用) 我认为这可能与此链接类似,但我认为我是在声明函数,而不是在then声明中调用它? 预期产出: starting: 3 ending: 3 starting: 2 ending: 2 starting: 1 ending: 1 实际产量: starting: 3 starting:

我试图使用for循环按顺序调用一系列承诺,但在以正确的顺序工作时遇到了困难。从理论上讲,控制台应该记录第一个块,而不是记录第二个块(这意味着所有承诺都在同一时间被调用,而第二个承诺只在第一个之后被调用)

我认为这可能与此链接类似,但我认为我是在声明函数,而不是在then声明中调用它?

预期产出:

starting: 3 
ending: 3
starting: 2 
ending: 2
starting: 1  
ending: 1 
实际产量:

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


您的小提琴与问题中的代码略有不同。但你几乎就在那里。只缺少一个return语句

你说得对:
temp=temp.then(延迟(元素))调用
延迟
。您需要的是返回一个函数,该函数将调用
delay
。(你把它放在小提琴上了。)

唯一缺少的是一个
返回
返回:)


这是工作小提琴:

您的小提琴与问题中的代码略有不同。但你几乎就在那里。只缺少一个return语句

你说得对:
temp=temp.then(延迟(元素))调用
延迟
。您需要的是返回一个函数,该函数将调用
delay
。(你把它放在小提琴上了。)

唯一缺少的是一个
返回
返回:)


这是一把工作小提琴:

@DanTang我喜欢用
reduce
建立一系列承诺:@DanTang我喜欢用
reduce
建立一系列承诺:
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;
    }
});