Javascript RxJs:请求的顺序发送实际上不是顺序的
我需要按顺序发送一组相同的请求:仅当前一个请求完成时(即,我得到了响应),才应发送下一个请求。我有以下代码Javascript RxJs:请求的顺序发送实际上不是顺序的,javascript,typescript,rxjs,Javascript,Typescript,Rxjs,我需要按顺序发送一组相同的请求:仅当前一个请求完成时(即,我得到了响应),才应发送下一个请求。我有以下代码 Observable.of(ids) .pipe( concatMap(ids => ids.map(id => this.doRequest(id))) ) .subscribe((res) => { //one more request here }) 下一个请求不等待上一个请求完成。此外,当我在s
Observable.of(ids)
.pipe(
concatMap(ids => ids.map(id => this.doRequest(id)))
)
.subscribe((res) => {
//one more request here
})
下一个请求不等待上一个请求完成。此外,当我在subscribeN
中执行一个以上请求时,将发送请求(其中N
等于id.length
),而不是一个请求
有人能给我解释一下这里发生了什么,我如何解决这个问题吗
提前谢谢你
UPD。看起来需要提供更多关于我尝试做什么的详细信息。在遵循@martin answer之后,代码如下所示
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
})
如果您想等待,您需要处理单个排放,并让它逐个处理。您现在拥有的将
ids
作为一个数组推送到concatMap
中,然后创建一个可观察的数组。相反,您可以在concatMap
之前将ids
解压成单独的排放:
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
})
如果您想等待,您需要处理单个排放,并让它逐个处理。您现在拥有的将
ids
作为一个数组推送到concatMap
中,然后创建一个可观察的数组。相反,您可以在concatMap
之前将ids
解压成单独的排放:
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
})
谢谢你的回答!我已经重新组织了代码(请参阅问题的更新),但
调试器
仍被激发N次
对我来说不合适。我该如何解决这个问题?没错,每个项目都需要它,但你的问题是它没有被称为顺序。是的,这是另一个问题。我仍然需要找到一个解决方案。您可以使用toArray()
收集所有响应,或者您可以使用ignoreElements()
这样您就不会收到任何值,这取决于您想做什么。谢谢您的回答!我已经重新组织了代码(请参阅问题的更新),但调试器
仍被激发N次
对我来说不合适。我该如何解决这个问题?没错,每个项目都需要它,但你的问题是它没有被称为顺序。是的,这是另一个问题。我仍然需要找到一个解决方案。您可以使用toArray()
收集所有响应,或者使用ignoreElements()
这样您就不会收到任何值,这取决于您想做什么。