如何在rxjs6中将CombineLatest与flatMap结合使用?

时间:2019-10-30 06:48:35

标签: react-native rxjs rxjs5 rxjs6 rxjs-observables

我在React Native中将代码与rxjs 5.5.12一起使用,它可以正常工作。

在rxjs 5.5.12中:

// the function will return Observable
  rxInit() {
    return Observable.combineLatest(
      myObservable1,
      myObservable2,
    ).flatMap((result) => {
      console.log('rxInit result =>', result) // I can see the result
      const [token, email] = result

      this.token = token
      this.email = email

      // check the value is empty or not and return Observable.

      if (this.token != null && this.email != null) {
        return Observable.fromPromise(myApiPromise).catch(handleErrorFunction)
      } else if (this.token != null && this.uid != null) {
        return Observable.fromPromise(myApiPromise).catch(handleErrorFunction)
      } else {
        return Observable.of(null)
      }
    })
  }

在rxjs 6.5.3中:

首先导入一些演艺人员:

import { combineLatest } from 'rxjs';
import { flatMap } from 'rxjs/operators';

我更改代码:

rxInit() {
  console.log('rxInit start');

  return combineLatest(
    myObservable1,
    myObservable2
   ).flatMap((result) => {
     console.log('rxInit result =>', result)
   });

   console.log('rxInit end');
 }

它将显示错误TypeError: (0 , _rxjs.combineLatest)(...).flatMap is not a function

所以我注意到可能是我必须使用pipe,我尝试更改代码。

rxInit() {
    console.log('rxInit start'); // it works.

    return combineLatest(
      myObservable1,
      myObservable2
    ).pipe(flatMap((result) => {
      console.log('rxInit result =>', result);  // the console log doesn't work
    }));
    console.log('rxInit end'); // the console log doesn't work
  }

我不知道为什么无法在console.log中得到结果。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

看起来您没有从flatMap()返回任何内容,rxjs中使用了mergeMap来支持flatMap btw。您需要返回一个可观察值。

return combineLatest(
  myObservable1,
  myObservable2
).pipe(mergeMap((result) => {
  console.log('rxInit result =>', result);  // the console log doesn't work
  return of(result)
}));