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引用的内容:(
感谢您的阅读,祝您度过愉快的一天。
答案 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.
});