我正在尝试对 RxJS HTTP 调用进行基本链接,其中第一个调用将在服务器端创建的对象的 ID 传递到第二个调用中。我在实现中观察到的是,仅进行了第一个调用,而第二个链式调用从未执行。
下面是我的大致代码。
第一次通话:
createItem(itemData) {
return this.http.post(createUrl, itemData)
.map((res) => res.json())
.catch(this.handleError);
}
第二次调用:
addFileToItem(id, file): Observable<any> {
return this.http.post(secondUrl + id, file)
.map((res) => log(res))
.catch(this.handleError);
}
函数定义将一个调用映射到另一个调用:
createAndUpload(itemData, file): Observable<any> {
return createItem(itemData, file)
.map((res) => {
if (file) {
return addFileToItem(res.id, file);
}
});
}
最后,可观察对象是通过 subscribe()
执行的:
someFunction(itemData, file) {
createAndUpload(itemData, file)
.subscribe(res => {
log(res);
//go do something else
};
}
最佳答案
问题出在 createAndUpload
中,其中 map
只是将第一次调用的结果转换为 Observable,但你从未订阅它。
简单地说,您只需要使用 mergeMap
(或 concatMap
在这种情况下并不重要)而不是 map
。 mergeMap
运算符将订阅内部 Observable 并发出其结果:
createAndUpload(itemData, file): Observable<any> {
return createItem(itemData, file)
.mergeMap((res) => {
if (file) {
return addFileToItem(res.id, file);
}
return Observable.empty(); // you can't return `undefined` from the inner Observable
});
}
关于javascript - 将一个 RxJS observable 的结果传递到下一个连续的 observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49285285/