我试图在角度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或我试过的任何其他方法。 如果有人可以指出我做错的地方,那将会很棒。
答案 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
。