javascript – 转换RxJS Observable

我使用angularFirestore来查询firebase,我希望使用DocumentReference连接来自多个文档的数据.

管道中的第一个运算符映射返回一个IOrderModelTable数组,第二个运算符,即switchMap迭代数组,每个元素使用每个元素中包含的id来查询其他表中的数据.

问题是在swithMap中我得到了一个可观察的数组,因为有了一个anidated map运算符.我如何获取IOrderModelTable数组,然后返回此数组的observable.

代码是:

getDataTableOperatorsFromDB(): Observable<IOrderModelTable[]> {
  const observable = this.tableOperatorsCollectionsRef.snapshotChanges().pipe(
    map(actions => {
      return actions.map(a => {
        const data = a.payload.doc.data() as IOrdersModelDatabase;
        const id = a.payload.doc.id;

        data.ot = id;
        return data;
      });
    }),
    switchMap(data => {
      const result = data.map(element => {
        return this.afs.collection('Orders/').doc(element.orderNumberReference.id).valueChanges().pipe(map(order => {
          return {
            otNumber: element.ot,
            clientName: '',
            clientReference: order.clientReference,
            id: element.orderNumberReference,
          };
        }));
      });

      // Result must be an IOrderModelTable[] but is a Observable<IOrderModelTable>[]

      return of(result);
    })
  );

解决方法:

您可以使用to Array运算符将流转换为数组,但请确保您的流将结束.
诀窍是选择正确的流.

对于您的问题,自然来源将是您第一次通话时收到的列表.以示意图的方式,我可以把它,你得到一个id列表,你转换成一个增强信息列表:

第一次输入… snapshopChanges():

—-[A, B, C]——>

每个元素都通过… valueChanges()转换:

——-Call A ————-DataA——–>

——-Call B ————————DataB—–>

——-Call C ——————–DataC—–>

然后使用toArray()减少:

———————————————-[DataA, DataC, DataB]——–>

码:

getDataTableOperatorsFromDB(): Observable<IOrderModelTable[]> { {
  return this.tableOperatorsCollectionsRef.snapshotChanges()
    .pipe(
      map(actions => {
        from(data).pipe(
          map(action => {
            const data = a.payload.doc.data() as IOrdersModelDatabase;
            const id = a.payload.doc.id;
            data.ot = id;
            return data;
          }),
          mergeMap(element => {
            return this.afs.collection('Orders/').doc(element.orderNumberReference.id).valueChanges().pipe(
              map(order => {
                return {
                  otNumber: element.ot,
                  clientName: '',
                  clientReference: order.clientReference,
                  id: element.orderNumberReference,
                };
              })
            );
          }),
          toArray()
        );

      })
    )
}

重要提示:我用mergeMap替换了switchMap,否则可能会丢掉一些信息.

上一篇:javascript – 如何在Angular2中取消订阅


下一篇:《第一本docker书》第4章 使用docker镜像和仓库 读书笔记