在这个答案中,一个承诺链是递归建立的.
稍微简化,我们有:
function foo() {
function doo() {
// always return a promise
if (/* more to do */) {
return doSomethingAsync().then(doo);
} else {
return Promise.resolve();
}
}
return doo(); // returns a promise
}
Run Code Online (Sandbox Code Playgroud)
据推测,这会产生一个调用堆栈和一个承诺链 - 即"深"和"宽".
我预计内存峰值会大于执行递归或单独建立一个promise链.
我有一些看起来像的代码
//service.ts
addProduct(productId) {
this.http.post('someUrl', ReqData).map(json).subscribe(doStuff);
}
//component.ts
addAllproducts(productsIds) {
productIds.forEach(productId => service.addProduct(productId);
}
Run Code Online (Sandbox Code Playgroud)
我想要的是能够在调用下一个productId之前等待每个调用完成,而不使用window.setTimeout..
遇到了angularjs和一些承诺的问题。由于某种原因,我的服务混合了查询的答案,虽然服务已修复,但我需要将 $q.all() 更改为按顺序运行,而不是异步运行所有承诺。
现在,它看起来像这样:
var promises = [p1, p2, p3];
$q.all(promises).then(function () {
// All promises are done
}).catch(function (exception) {
// An error occured.
});
Run Code Online (Sandbox Code Playgroud)
预期的行为应该类似于p1.then(p2).then(p3);,并且顺序并不重要(因为通常运行异步)。数组长度是可变的。
由于 $q 受到 Q lib 的启发,我查看了 Q 文档并找到了序列参考,但无法使其与 $q 一起使用。
任何人都可以推荐一个简单的解决方案来解决此类问题吗?
我确实尝试过这个promises.reduce($q.when, $q(initialVal));,但不明白initialVal指的是什么:(
感谢您的阅读,祝您有美好的一天。