如何在Angular的可观察地图中返回可观察的物体

时间:2019-06-11 15:49:30

标签: angular rxjs

我真的找不到我想做的事。所以我只展示我的尝试。这就是我尝试过的:

register(): Observable<boolean> {

   return this.registerNew().pipe(
     map(userData => {
       return this.updateProfile().pipe(                   (*1)
         map(profileData => {
           return profileData ? true : false;
         }))
     }))
}

但是我当然会收到以下错误消息:

Type 'Observable<false | Observable<boolean>>' is not assignable to type 'Observable<boolean>'.

我也在考虑使用await而不是在我标记为(* 1)的行中返回。

但是我仍然无法以一种很好的方式使其工作。

4 个答案:

答案 0 :(得分:2)

如果您想从一个可观察的对象切换到另一个并使用前一个的值,可以使用switchMap运算符

register(): Observable<boolean> {

   return this.registerNew().pipe(
     switchMap(userData => {
       return this.updateProfile().pipe(                   (*1)
         map(profileData => {
           return profileData ? true : false;
         }))
     }))
}

发生registerNew的原因,然后将结果值传递到switchMap返回的observable(switchMap必须返回一个observable才能工作),然后将内部的observable的结果传递给{{1} })来到订户。

答案 1 :(得分:1)

如果您想将可观测对象的值映射到另一个可观测对象,则要使用mergeMapswitchMapconcatMap(取决于您希望新创建的值的方式)可以观察到)。

await不适用于可观察对象,仅适用于承诺。

答案 2 :(得分:1)

当您不需要发射值,而只想切换到另一个可观察值时,可以使用switchMapTo()运算符。

register(): Observable<boolean> {
   return this.registerNew().pipe(
     switchMapTo(this.updateProfile()),
     map(Boolean)
   );
}

答案 3 :(得分:0)

您需要concatMap

  1. 此示例仅在返回用户ID后才要求用户ID
  2. 第二个“ observable”使用第一个到第一个的返回值 进行用户查询
this.authenticationService.currentUser.pipe(
    concatMap((principal: Principal) => this.getUser(principal.id))
).subscribe((user: User) => {
    console.log(user); // the user
});