【问题标题】:Promise.all() using RxJs.ObservablePromise.all() 使用 RxJs.Observable
【发布时间】:2018-04-26 18:03:02
【问题描述】:

我正在尝试在 Angular 5 中使用 RxJs Observable 实现 Promise.all 等效项,已经尝试了所有建议的解决方案 here,但没有一个对我有用,链中的 http 请求根本没有被触发。

这是我要执行的代码:

let selected = [{channel: 1},{channel: 2},{channel: 3}];

postToDB(item: any): Observable<any> {
   return this.http.post('/api/items/', item);
}

submitAll() {
   let submitAllSelected = selected.map((item: any) => {
      return this.postToDB(item).map((res: Response) => res.json());
   });

  Observable.forkJoin(submitAllSelected)
    .subscribe((result: any) => {
      this.toaster.success('item saved successfully');
    }, (err: any) => {
      this.toaster.error(JSON.stringify(err));
    }, () => {
     this.toaster.success('All items saved successfully');
    });

}

由于某种原因,我无法弄清楚,在调用 submitAll() 并且未调用订阅回调之后,未触发 http 请求。 我设法使它工作的唯一方法是在 postToDB() 函数之后添加 .subscribe(cb) 或 .toPromise() 。

这种方法适用于:

Promise.all(selected.map(item => postToDB(item).toPromise()).then(//do something);

但不是 Observable.forkJoin/zip/concat 或我尝试过的任何其他方法。 如果有人能指出我做错了什么,那就太好了。

【问题讨论】:

  • 你能做一个演示吗?

标签: angular rxjs observable es6-promise


【解决方案1】:

问题出现了:

let submitAllSelected = selected.map((item: any) => {
      return this.postToDB(item).map((res: Response) => res.json());
});

submitAllSelected 的类型为 Observable&lt;Promise&lt;any&gt;&gt;[]。应该是Observable&lt;any&gt;[]

正确方法:

let submitAllSelected = this.selected.map((item: any) => {
      return this.postToDB(item).pipe(map(data => data))
});

如果您使用HttpClient,则无需将响应转换为json

StackBlitz Demo

【讨论】:

  • 哇哦!这确实有效!但是我突然发现为什么它一直对我不起作用...看来,我使用的函数:postToDB(item: any) 使用了无类型的代理函数,这意味着它没有返回 Observable,但键入为 void。奇怪,因为打字不应该随时改变返回值。
猜你喜欢
  • 2015-08-30
  • 1970-01-01
  • 2016-11-05
  • 2020-06-24
  • 2018-10-06
  • 2020-04-24
  • 2022-01-08
  • 2020-01-31
相关资源
最近更新 更多