1

for ループを使用して一連の promise を順番に呼び出そうとしていますが、正しい順序で作業するのに苦労しています。理論的に言えば、コンソールは最初のブロックをログに記録する必要がありますが、代わりに 2 番目のブロックをログに記録します (最初のプロミスの後にのみ呼び出される 2 番目のプロミスと比較して、すべてのプロミスが同時に呼び出されることを意味します)。

これはこのリンクに似ているのではないかと思いましたが、then宣言で呼び出すのではなく、関数を宣言していると思いますか? JavascriptでQを使用してプロミスを順次実行する方法は?

期待される出力:

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