我正在尝试发出多个 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 完成之前按顺序订阅。
如果我替换concat为forkJoin我会得到我期望的结果。我并不特别关心顺序,所以我可以很好地使用,forkJoin但我想了解为什么使用concat不起作用。
您所看到的有点令人困惑,但这是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 并只是迭代它的项目,这不是你想要的。