【问题标题】:Return a single object after Observable is completeObservable 完成后返回单个对象
【发布时间】:2018-04-09 22:06:29
【问题描述】:

我有一个带有几个元素(字体)的 Observable

myFontsObservable = Observable.of<Font>(new Font("font1"), new Font("font2"));

现在我想订阅这个 Observable,处理所有的 Fonts 并将它们注册到一个 Document 中,然后在处理完所有这些之后,返回 Document

public registerFonts(myFontsObservable): Observable<Document> {
    doc = new Document();
    myFontsObservable.subscribe(
        font => doc.register(font);
        (err) => {},
        () => return Observable.of(doc);
    );
    // I need to return something here too
}

此代码无法编译,因为我还需要在订阅之外返回一些内容。但是,如果我在那里返回一些东西,那么当我调用 registerFonts(...) 时,我会得到错误的值,因为它还没有完成

我该怎么做?

【问题讨论】:

    标签: javascript angular rxjs observable


    【解决方案1】:

    你可以试试这些方法

    public registerFonts(myFontsObservable): Observable<Document> {
        return myFontsObservable
               .reduce((doc, font) => {
                  doc.register(font);
                  return doc
               }, new Document())
    }
    

    【讨论】:

      【解决方案2】:

      使用 mergeMap 运算符(可管道)。

      这个操作符会处理第一个 observable 的结果,并且需要返回另一个 observable。我相信这就是你所需要的。

      public registerFonts(myFontsObservable): Observable<Document> {
          doc = new Document();
          return myFontsObservable.pipe(
            mergeMap(font => {
              doc.register(font);
              return Observable.of(doc);
            })
          );
      }
      

      【讨论】:

      • 如果你这样做,你会发出 2 次 Document:第一次是在注册第一个字体之后,第二次是在注册第二个字体之后。
      • 我不知道他怎么称呼它,但无论如何你都错了:它返回 2 个不同的文档,而不是同一个文档的 2 次。但我明白你的意思。那里的目的是什么?我以为他只需要写一个正确的函数,但似乎不是这样......
      • 我不确定它是否总是不同的文档。 doc 总是指在函数的第一行创建的同一个对象。
      • 如果函数被调用2次,doc被创建2次。函数不是调用了 2 次吗?这对我来说根本不清楚......
      猜你喜欢
      • 2018-12-18
      • 1970-01-01
      • 2016-09-15
      • 2021-08-25
      • 1970-01-01
      • 2021-11-13
      • 2018-02-07
      • 2014-09-21
      • 1970-01-01
      相关资源
      最近更新 更多