Promise.all()使用RxJs.Observable

时间:2018-04-26 08:58:07

标签: angular rxjs observable es6-promise

我试图在角度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()并且未调用subscribe回调之后,不会触发http请求。 我设法让它工作的唯一方法是在postToDB()函数之后添加.subscribe(cb)或.toPromise()。

这种方法适用于:

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

但不是使用Observable.forkJoin / zip / concat或我试过的任何其他方法。 如果有人可以指出我做错的地方,那将会很棒。

1 个答案:

答案 0 :(得分:1)

有问题:

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

submitAllSelected的类型为Observable<Promise<any>>[]。它应该是Observable<any>[]

正确的方式:

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

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

StackBlitz Demo