Javascript 将一个RxJS可观测值的结果传递到下一个连续可观测值

Javascript 将一个RxJS可观测值的结果传递到下一个连续可观测值,javascript,rxjs,Javascript,Rxjs,我正在尝试对RxJS HTTP调用进行基本链接,其中第一个调用将把服务器端创建的对象的ID传递给第二个调用。我在实现中观察到的是,只进行了第一次调用,而从未执行第二次链式调用 下面是我大致掌握的代码 第一个电话: createItem(itemData) { return this.http.post(createUrl, itemData) .map((res) => res.json()) .catch(this.handleError); } 第二个电话: ad

我正在尝试对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);
}
显然,
map()
函数实际上没有返回任何内容,这意味着不返回
可观察的对象。相反,需要一个变换操作符,例如
mergeMap

下面是最后运行的代码,也使用了“更新的”
.pipe()
操作符。代码唯一需要更改的地方是在Observable函数中,在这里我定义了两个单独的Observable的组合。要访问
mergeMap
操作符,请不要忘记从
rxjs/operators
导入它

出于我最终会弄明白的原因,如果没有管道,我无法访问
mergeMap

createAndUpload(itemData, file): Observable<any> {
  return createItem(itemData, file)
    .pipe(
        mergeMap((res) => {
          if (file) {
            return addFileToItem(res.id, file);
          }
        })
     )
}
createAndUpload(itemData,file):可观察{
返回createItem(itemData,文件)
.烟斗(
合并映射((res)=>{
如果(文件){
返回addFileToItem(res.id,file);
}
})
)
}

问题在于
createAndUpload
中的
map
只是将第一次调用的结果转换为可观察结果,但您从未订阅过它

简单地说,您只需要使用
mergeMap
(或者
concatMap
,在本例中,这并不重要)而不是
map
mergeMap
操作符将订阅内部可观察对象并发出其结果:

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
    });
}
createAndUpload(itemData,file):可观察{
返回createItem(itemData,文件)
.mergeMap((res)=>{
如果(文件){
返回addFileToItem(res.id,file);
}
return Observable.empty();//不能从内部Observable返回'undefined'
});
}

谢谢@ZahiC。我将发布一个正确更正的答案。
createAndUpload(itemData, file): Observable<any> {
  return createItem(itemData, file)
    .pipe(
        mergeMap((res) => {
          if (file) {
            return addFileToItem(res.id, file);
          }
        })
     )
}
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
    });
}