Angularjs $ q按序列运行

时间:2015-09-24 10:02:57

标签: javascript angularjs angular-promise

angularjs 和一些承诺存在问题。由于某种原因,我的服务混合了查询的答案,并且在修复服务时我需要更改我的$ q.all()而不是异步运行所有promises,依次运行。

现在,它看起来像这样:

var promises = [p1, p2, p3];

$q.all(promises).then(function () {
    // All promises are done
}).catch(function (exception) {
    // An error occured.
});

预期的行为应该像p1.then(p2).then(p3);,顺序无关紧要(因为通常运行异步)。数组长度是可变的。

由于$ q的灵感来自于Q lib,我查看了Q文档并找到了a sequence reference,但无法使其与$ q一起使用。

任何人都可以为这样的问题推荐一个简单的解决方案吗?

我确实试过这个promises.reduce($q.when, $q(initialVal));,但不了解initialVal引用的内容:(

感谢您的阅读,祝您度过愉快的一天。

1 个答案:

答案 0 :(得分:3)

如果你已经有了promises,那么异步方法已经被触发了!你必须逐个触发它们,所以你的数组需要包含返回promises而不是promise对象的函数。

然后你就可以这样做了,这比你在问题中提供的Q的快捷方式更清楚:

var promiseReturningFunctions = [p1, p2, p3];
var queueEntryPoint = $q.defer();
// create a waiting queue
var queue = queueEntryPoint.promise;
// this queues up the asynchronous functions
promiseReturningFunctions.forEach(function (p) {
    queue = queue.then(p);
});
// here we start processing the queue by resolving our queueEntryPoint
queueEntryPoint.resolve();
// we can now use queue.then(...) to do something after all promises in queue were resolved
queue.then(function () {
    // All promises are done
}).catch(function (exception) {
    // An error occured.
});