Как подписать несколько наблюдаемых в rxjs 6? do не является функцией в rxjs 6 - PullRequest
0 голосов
/ 30 октября 2019

В rxjs 5.5.12 я создал login() до subscribe с кратным, наблюдаемым do()

login(userEmail, userPassword).subscribe((response) => {
  console.log(response);

  if (response === 'something') {
    // some actions
  } else {
    // some actions
  }
},(error) => {
  // some error actions
});

Я использую rxLoginPOST для вызова api:

rxLoginPOST(url, params) {
  return Rx.Observable.fromPromise(somePromise).catch(handleErrFunction);
}

Я использую его в функции входа в систему, он возвращает несколько наблюдаемых:

login(email, password) {
  return APIService.shared.rxLoginPOST('users/signin', { ...arguments })
  .flatMap((response) => {
    if (response.status === 200) {
        return Rx.Observable.combineLatest(
          myObservable1,
          myObservable2,
          myObservable3
        )
      } else {
        return Rx.Observable.of(response)
      }
  }).do((result) => {
      if (result.length > 0) {
        // some logic
      } else {
        return Rx.Observable.of(result)
      }
  }).flatMap((result) => {
      if (result.length > 0) {
        return this.checkUserIsRegistered()
      } else {
        return Rx.Observable.of(result)
      }
  })
}

В rxjs 6.5.3 я изменил весь импорт, как

import { Observable, combineLatest, of } from 'rxjs';
import { mergeMap, map, catchError, flatMap, tap } from 'rxjs/operators';

Если я активирую login(), он покажетdo is not a function

Поэтому я меняю код:

login(userEmail, password) {
    return APIService.shared.rxLoginPOST('users/signin', { ...arguments }).pipe(
        mergeMap((response) => {
        if (response.status === 200) {
          return combineLatest(
            myObservable1,
            myObservable2,
            myObservable3
          )
        } else {
          return of(response)
        }
      }).tap((result) => { // I am stuck here, I have no idea how to continue with it...
         console.log('check 4');  // check 4 does not appear.
         console.log('response', response);
         return of(response)
      }
    );

Я пытаюсь использовать tap вместо do, но проверка 4 не появляется.

Любая помощь будет оценена.

1 Ответ

1 голос
/ 30 октября 2019

С pipe вы должны связать своих операторов следующим образом: pipe(op1, op2), а не как pipe(op1).op2()

login(userEmail, password) {
    return APIService.shared.rxLoginPOST('users/signin', { ...arguments })
      .pipe(
          mergeMap((response) => {
            if (response.status === 200) {
              return combineLatest(
                myObservable1,
                myObservable2,
                myObservable3
              )
            }
            return of(response)
          }),
          tap((result) => { 
            console.log('check 4');  // check 4 does not appear.
            console.log('response', response);
          })
        );

Я также удалил ваше бесполезное утверждение else, так как вы возвращали что-то раньше:)

РЕДАКТИРОВАТЬ : Как предлагается в комментариях, инструкция return из tap также была удалена из-за ненужности

...