javascript - 尝试使用具有顺序 promise 的 for 循环的问题 (q)

标签 javascript angularjs promise q

我正在尝试使用 for 循环按顺序调用一系列 promise ,但我无法按正确的顺序工作。从理论上讲,控制台应该记录第一个 block ,而不是记录第二个 block (这意味着与第二个 promise 仅在第一个之后调用相比,所有 promise 都被同时调用)。

我认为这可能类似于此链接,但我认为我是在声明函数而不是在 then 声明中调用它? How to sequentially run promises with Q in Javascript?

预期输出:

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

最佳答案

您的 fiddle 与问题中的代码略有不同。但你几乎在那里。只缺少一个返回语句。

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

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

这是工作 fiddle :http://jsfiddle.net/4k6t9/6/

关于javascript - 尝试使用具有顺序 promise 的 for 循环的问题 (q),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18607413/

相关文章:

Javascript 函数不会重复自身

angularjs - 如何过滤标签输入按键时的自动完成结果

javascript - 在angular-chart.js的饼图中显示数据标签

typescript - 如何在 TypeScript 中使用 fetch

javascript - 用CSS实现加权灵活布局

javascript - 带有原型(prototype)函数名称.argument 的 JavaScript 函数调用如何工作?

javascript - 如何在 JavaScript 中创建指针

javascript - 使用 angularjs 处理三部分日期字段验证

javascript - 在 VS Code 中调试时从 Promise 中的拒绝中获取未处理的异常

javascript - 将嵌套的 'for' 循环转换为 Promise,对于 Promise?嵌套 promise ?