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