【发布时间】:2019-10-05 10:05:39
【问题描述】:
我有一个对象数组。对于每个对象,我需要触发一个异步请求(http 调用)。但我只想同时运行一定数量的请求。此外,如果我可以在所有请求完成后有一个同步点以执行某些代码,那将是很好的(但不是必需的)。
我尝试过以下建议:
Limit number of requests at a time with RxJS
How to limit the concurrency of flatMap?
Fire async request in parallel but get result in order using rxjs
还有更多...我什至尝试制作自己的运算符。
要么这些页面上的答案太旧而无法使用我的代码,要么我无法弄清楚如何将所有内容放在一起以使所有类型都很好地适应。
这是我目前所拥有的:
for (const obj of objects) {
this.myService.updateObject(obj).subscribe(value => {
this.anotherService.set(obj);
});
}
编辑 1: 好的,我想我们快到了!随着 Julius 和 pschild 的回答(两者似乎同样有效),我设法限制了请求的数量。但现在它只会发射第一批 4 个,而不会发射其余的。所以现在我有:
const concurrentRequests = 4;
from(objects)
.pipe(
mergeMap(obj => this.myService.updateObject(obj), concurrentRequests),
tap(result => this.anotherService.set(result))
).subscribe();
我对@987654328@ 做错了吗?
顺便说一句:带有resultSelector 参数的mergeMap 已被弃用,所以我在没有它的情况下使用mergeMap。
还有,mergeMap中的obj在tap中是看不到的,所以只好用tap的参数
编辑 2:
确保您的观察者完成! (花了我一整天的时间)
【问题讨论】:
-
是的,你的弃用是对的 :-) 我相应地更新了我的答案。你能看看我在 Stackblitz 上的例子吗?我无法重现您遇到的错误...也许您还可以创建一个显示错误的示例?
-
我无法在 Stackblitz 中重现该问题。我认为这与 angular/electron/nodejs 没有任何关系……至少我希望如此。无论如何,这里有一个 Stackblitz,它与我的代码更相似:https://stackblitz.com/edit/rxjs-dawwsl?file=index.ts 我发誓我检查了代码字符的字符,但仍然......我唯一能说的是我的代码没有达到 finalize 方法。但是前 4 个请求都很好地通过了管道。
-
哦,还有,控制台上没有错误。我怎样才能找出卡住的位置和原因?我试过
catchError运算符 - 不走运。 -
我想我疯了..我将 stackblitz 代码复制到我的应用程序中并且它可以工作...所以我可以排除我的堆栈电子/角度等。我创建了另一个 stackblitz这更接近我的代码:https://stackblitz.com/edit/angular-7-master-yf1cik 我已经尝试了
subscribe方法中的错误函数......什么都没有 -
不错!很高兴我能帮上忙!
标签: javascript angular typescript rxjs rxjs-pipeable-operators