RxJs:顺序发送请求实际上不是顺序发送的

时间:2018-09-03 07:23:25

标签: javascript typescript rxjs

我需要按顺序发送一组相同的请求:只有在前一个请求完成后(即我得到了响应),才应该发送下一个请求。我有以下代码...

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 
    })

1 个答案:

答案 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}}