Решено - при запуске 2 наблюдаемых одна за другой - получение результата на основе первой - PullRequest
0 голосов
/ 04 марта 2020

У меня есть 2 функции, которые возвращают Observables, которые я хотел бы выполнять одну за другой. function1 return

Observable<SomeDataObject> 

и function2 тип возвращаемого значения

Observable<Any>

Я хочу, чтобы выполняющая их функция возвращала логическое значение на основе результата function1 . Мне удалось сделать это при первом запуске function1 , но теперь я хотел бы сначала запустить function2 , и я получаю сообщение об ошибке:

"Argument of type '(res: <SomeDataObject>) => boolean' is not assignable to 
 parameter of type '(value:SomeDataObject, index: number) => 
ObservableInput<any>. Type 'boolean' is not assignable to type 
ObservableInput<SomeDataObject>

См. Мой код: Этот работает :

return this.someService.function1().pipe(
  switchMap(f1Result => 
  {
     this.someService.repositpry.f1ResultData = f1Result;
     return this.someService.function2().pipe(
        map(res => 
       {
           if (res) return true;
           else return false;
       }));
   })
 ) 

Этот не работает :

 return this.someService.function2.pipe( 
  switchMap(f2Result => 
  {
      this.someService.function1().pipe(
       map(f1result => 
       {
           this.someService.repositpry.f1ResultData = f1Result;
       })
    );
    if (f2Result) return true
    else return false;
 }));

Решение:

return this.someService.function2().pipe( 
  switchMap(f2Result => 
  {
      return this.someService.function1().pipe(
       map((f1result) => 
       {
           this.someService.repositpry.f1ResultData = f1Result;
           if (f2Result) return true
           else return false;
       })
    );

 }));

Ответы [ 3 ]

1 голос
/ 04 марта 2020

Во втором примере в самой внешней трубе у вас есть

this.someService.function1().pipe(
       map(f1result => 
       {
           this.someService.repositpry.f1ResultData = f1Result;
       })

f1result - наблюдаемая. Во внутренней трубе вы используете оператор map. Это отличается от первого примера, который работает, так как в первом примере вы используете switchMap, который выравнивает наблюдаемое.

Так что вам, возможно, придется использовать switchMap во внутренней трубе как ну, а затем map, чтобы вернуть результат, который вы ищете, что-то вроде этого

return this.someService.function2.pipe( 
  switchMap(f2Result => 
  {
      this.someService.function1().pipe(
       switchMap(f1result => 
       {
           this.someService.repositpry.f1ResultData = f1Result;
       }.pipe(() => {
           if (f2Result) return true
           else return false;
       }))
    );
 }));

Нет реального примера, чтобы попробовать, это просто предложение

1 голос
/ 04 марта 2020

Привет, тебе нужен оператор concatMap, чтобы сделать это.

return this.someService.function1().pipe(
  concatMap(f1Result => 
  {
     this.someService.repositpry.f1ResultData = f1Result;
     return this.someService.function2.pipe(
        map(res => 
       {
           if (res) return true;
           else return false;
       }));
   })
 ) 
1 голос
/ 04 марта 2020

Вы должны серьезно поработать над своим вопросом. Также прочитайте это: { ссылка }

Вы делаете:

this.someService.function2.pipe(
  //...
)

Разве это не должно быть:

this.someService.function2().pipe(
  //...
);

Не видя вашего function1 и function2 люди не могут вам помочь.

...