Как вернуть наблюдаемое на наблюдаемой карте в Angular - PullRequest
0 голосов
/ 11 июня 2019

Я действительно не могу найти слов для того, что я хочу сделать.Так что я просто показываю свою попытку .. Это то, что я пытался:

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 вместо return в строке, которую я пометил (* 1).

Но все равно я не могу заставить его работать хорошим способом.

Ответы [ 4 ]

2 голосов
/ 11 июня 2019

Если вы хотите переключиться с одной наблюдаемой на другую и использовать значение из предыдущего, есть оператор switchMap, который можно использовать таким образом:

register(): Observable<boolean> {

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

Что приводит к тому, что registerNew,затем он передает полученное значение в switchMap возвращаемое наблюдаемое (switchMap должен возвращать наблюдаемое для работы), а затем результат внутреннего наблюдаемого (updateProfile) поступает подписчику.

1 голос
/ 11 июня 2019

Вы используете оператор switchMapTo () , когда вам не нужно излучаемое значение, и вы просто хотите переключиться на другое наблюдаемое.

register(): Observable<boolean> {
   return this.registerNew().pipe(
     switchMapTo(this.updateProfile()),
     map(Boolean)
   );
}
1 голос
/ 11 июня 2019

Если вы хотите отобразить значения вашей наблюдаемой на другую наблюдаемую, вы должны использовать mergeMap, switchMap или concatMap (в зависимости от того, как вы хотите, чтобы значения вновь созданной наблюдаемой передавались).

await не для Observables, только Обещания.

0 голосов
/ 11 июня 2019

Вам нужно concatMap.

  1. этот пример сначала запрашивает идентификатор пользователя, только когда он вернул
  2. второй «наблюдаемый» использует возвращаемое значение от первого до сделать запрос пользователя
this.authenticationService.currentUser.pipe(
    concatMap((principal: Principal) => this.getUser(principal.id))
).subscribe((user: User) => {
    console.log(user); // the user
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...