微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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,否则可能会丢掉一些信息.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐