我需要按顺序发送一组相同的请求:只有在前一个请求完成后(即我得到了响应),才应该发送下一个请求。我有以下代码...
Observable.of(ids)
.pipe(
concatMap(ids => ids.map(id => this.doRequest(id)))
)
.subscribe((res) => {
//one more request here
})
下一个请求不等待上一个请求完成。此外,当我在订阅中再执行一个请求时,将发送N
个请求(其中N
等于ids.length
)而不是一个请求。
有人可以向我解释这里发生了什么以及如何解决该问题?
提前谢谢!
UPD。似乎需要提供有关我要执行的操作的更多详细信息。在遵循@martin回答后,代码如下所示
let obj = {ids: [1, 2, 3]};
return Observable.of(obj)
.filter((tube: ResultTube) => {
return (
obj != null &&
obj.ids &&
obj.ids.length > 0
);
})
.switchMap(obj => {
return Observable.from(obj.ids);
})
.pipe(
concatMap(id => this.approveLaboratory(id))
)
.map((res) => {
debugger; //fired N times after subscribe() !
return obj
})
答案 0 :(得分:2)
如果您希望ids
等待,则需要处理单个排放并使其一一处理。您现在拥有的内容将concatMap
作为数组推入ids
,然后创建一个Observables数组。相反,您可以在concatMap
之前将Observable.from(ids)
.pipe(
concatMap(id => this.doRequest(id))
)
.subscribe((res) => {
//one more request here
})
拆成单独的排放物:
Observable.of(ids)
.pipe(
concatAll(), // unpack array of ids
concatMap(id => this.doRequest(id))
)
.subscribe((res) => {
//one more request here
})
...或者像这样:
{{1}}