【问题标题】:Is it mandatory to send everytime an observable from flatMap?每次都必须从 flatMap 发送一个 observable 吗?
【发布时间】:2021-08-03 13:03:34
【问题描述】:

我正在进行服务调用,根据该响应中的属性,我有两种情况。

案例 1 :以另一种格式返回响应。 案例 2:再次调用服务并返回修改后格式的新响应。

所以代码看起来像这样,

  this.service.getData()
    .flatMap(data => {
      if(data.xxx==='yyyy'){
        return Observable.of({    //LINE 1
          payload : data.objectx;
        });
      }else{
        return this.service.getAnotherData()
          .map(newData => {
            return {
              payload: newData.objectx;
            }
          });
      }
   }).Subscribe(res => this.payload =res.payload)

我使用 flatMap 是因为在一种情况下我需要返回一个 observable。在第一种情况(第 1 行)中是否也必须返回 observable?还是直接返回响应可以吗?

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    它必须返回一个可观察的。归根结底 - flatMap 只是一些运算符,它可以帮助我们用我们拥有的东西形成另一个可观察对象。所以它应该返回一个可观察的。从逻辑上讲,这是有道理的——如果你有一个订阅了这个 observable 的地方,你总是希望在任何一种情况下都会有一个值(如果有的话)。

    【讨论】:

    • 准确地说,它必须返回一个ObservableInput。它可以返回一个数组或一个承诺等。
    【解决方案2】:

    我承认我没有详细阅读您的问题,但您可以做的就是返回 EMPTY,这不会在最终流中添加任何内容。

    我在这里使用了这个策略,我有一个 BehaviorSubject<Observable<number>> 开头是空的。

    // create behavior subject OF Observable<number>
    const subject = new BehaviorSubject<Observable<number>>(EMPTY);
    
    // subscribe to it, using flatMap such as to 'unwrap' the observable
    const unwrappedSubject = subject.pipe(flatMap((x: number) => x));
    unwrappedSubject.subscribe(s => console.log(s));
    
    // push an observable into the subject
    const tim = timer(1000, 1000);
    subject.next(tim);
    

    【讨论】:

      猜你喜欢
      • 2020-09-11
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 2013-06-25
      • 2016-11-04
      • 2012-01-20
      相关资源
      最近更新 更多