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 
    })
下一个请求不等待上一个请求完成。此外,当我在subscribe
N
中执行一个以上请求时,将发送请求(其中
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()
这样您就不会收到任何值,这取决于您想做什么。