【发布时间】:2018-09-20 13:34:40
【问题描述】:
假设我在 provider 中有一个函数:
saveCar(car: Car) {
return this.saveCarImages(car).subscribe(
(data:any) => {
if(data[0].seats){
car=data[0];
}
return this.api.put(`/car/${car.id}`, car, {
headers: {
'Content-Type': 'application/json'
}
});
}
)
}
provider 中的这个辅助函数必须在实际汽车被保存之前执行:
saveCarImages(car: Car) {
return Observable.create((observable) => {
let fileSaver = this.injector.get(FileSaverProvider);
let promisearr = [];
promisearr.push(Observable.create((observable) => {
fileSaver.uploadImage(car.helpImage.file).subscribe(
(data: any) => {
car.helpImageId = data.id;
observable.complete(car);
}
)
})
)
promisearr.push(Observable.create((observable) => {
fileSaver.uploadImage(car.helpImage2.file).subscribe(
(data: any) => {
car.helpImageId2 = data.id;
observable.complete(car);
}
)
}));
return Observable.forkJoin(promisearr);
});
}
然后我在组件的 TS 文件中有这段代码:
this.provider.saveCar(this.car).subscribe(
(response: any) => {
if (response) {
//success
}
},
(error: any) => {
//error
}
);
但这不起作用。我在这里试图实现的是从组件的 TS 文件订阅 this.api.put(car) ,但我需要先上传汽车图像,因此 this.api.put(car) 嵌套在可观察到的保存图像。如何从组件的 TS 文件中订阅 this.api.put(car)?
【问题讨论】:
-
这一定是 RxJS 的第一大问题。您需要的是
mergeMap运算符。请参考这个解释:reactivex.io/documentation/operators/flatmap.html 和实现:learnrxjs.io/operators/transformation/mergemap.html
标签: angular asynchronous promise rxjs