【问题标题】:How to convert an Observable stream into an Observable Array如何将 Observable 流转换为 Observable 数组
【发布时间】:2017-09-24 16:44:58
【问题描述】:

我正在尝试从数据库中检索狗的列表。我想以Observable<Dog[]> 检索狗列表。但是,当我调用 toArray() 或使用任何其他方法尝试将传入流转换为数组时,我在调用 retrieveDogs(dogsId) 方法时不会收到任何数据。如何检索Observable array 而不仅仅是Observable stream

    retrieveDogs(dogIds : Array<string>): Observable<Dog[]>{
        return Observable.from(dogIds)
                .map(dogId => this.retrieveDog(dogId)) 
                .flatMap(dogObservable => dogObservable)
                .toArray();
     }

    retrieveDog(dogId : string) : Observable<DogEntity> {
     //afDB -> AngularFireDatabase that returns an observable with the data from the firebase database
        return this.afDB.object(DB_DOGS + DB_DASH + dogId)
                .map(dogObject =>DogEntity.convertObject(dogId,dogObject)
    }

【问题讨论】:

  • 短篇小说,你不知道,可观察对象是事件流。您可以使用 toArray 将 src observable 中的所有数据缓冲到一个数组中。 github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/…是你想要的吗?
  • 我明白你关于流的意思。我注意到 toArray() 需要某种形式的 complete() 方法才能被触发,以便它封装数组并返回 observable。不幸的是,AngularFire 方法不会触发任何完整的方法,因此 toArray() 只是等待,因此没有返回任何内容。

标签: javascript angular reactjs typescript observable


【解决方案1】:

您可以这样做来检索您的数据:

retrieveDogs(dogIds : Array<string>): Observable<Dog[]>{
  let obs = dogIds.map(dogId => this.retrieveDog(dogId));

  return Observable.forkJoin(obs);
}

retrieveDog(dogId : string) : Observable<DogEntity> {
  return this.afDB.object(DB_DOGS + DB_DASH + dogId)
    .map(dogObject => DogEntity.convertObject(dogId,dogObject));
}

这里有简单的演示http://jsbin.com/sotunopocu/2/edit?js,console

【讨论】:

    猜你喜欢
    • 2018-10-23
    • 2020-12-01
    • 2021-10-27
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 2023-03-16
    相关资源
    最近更新 更多