为什么在 Angular 中连接多个 HttpClient 调用时,concat RxJS 运算符会发出 Observables 而不是值

rya*_*all 3 rxjs angular

我正在尝试发出多个 HTTP 请求来响应“全部更新”按钮的单击。我的代码如下所示:

let new_items:Observable<ApiResponse<ShoppingListItem>>[] = this.items
      .map(item => new ShoppingListItem(...))
      .map(item => this.shoppingListService.updateItem(item));


concat(new_items).subscribe(
  r => console.log(r);
);
Run Code Online (Sandbox Code Playgroud)

this.shoppingListService.updateItem返回通过调用生成的 Observable httpClient.put

运行此代码时,我希望看到打印的值是console.log(r)该方法生成的类型updateItem。相反,它是一个可观察的。我的服务器日志表明没有发出 HTTP 请求。这似乎表明它没有被订阅。我对文档的理解concat是,传递给的每个单独的 Observableconcat将在 Observable 完成之前按顺序订阅。

如果我替换concatforkJoin我会得到我期望的结果。我并不特别关心顺序,所以我可以很好地使用,forkJoin但我想了解为什么使用concat不起作用。

mar*_*tin 5

您所看到的有点令人困惑,但这是concat()和的预期行为forkJoin()

forkJoin()可将 Observables 数组和扩展 Observables 作为单独的参数一起使用:

forkJoin(obs1, obs2, obs3)
// or
forkJoin([obs1, obs2, obs3])
Run Code Online (Sandbox Code Playgroud)

但有了concat它就不同了。它只期望源 Observables (或ObservableInput)作为单独的参数,如下所示:

concat(obs1, obs2, obs3)
Run Code Online (Sandbox Code Playgroud)

但是如果你传递一个数组,concat([obs1, obs2, obs3])它会将数组作为 ObservableInput 并只是迭代它的项目,这不是你想要的。