在rxjs中创建树数据视图的正确方法

时间:2019-08-22 09:04:18

标签: javascript rxjs rxjs6

我有一系列描述实体关系的数据。 我的代码:

services
            .tree
            .collection
            .find()
            .$
            .pipe(
                switchMap(from),
                groupBy((value) => value.get('parent_id')),
                mergeScan((memo, group$) => {
                    const key = group$.key;

                    return group$.pipe(
                        map((value) => {
                            if(!(key in memo)) {
                                memo[key] = [];
                            }
                            memo[key].push(value);

                            return memo;
                        })
                    )
                }, {}),
            )
            .subscribe((data) => console.log('data', data));

但是有很多日志,而不是一个日志。如何将所有内容合并到一个管道中,以最后只有一个数据?

1 个答案:

答案 0 :(得分:1)

我认为CodeSandbox中正在发生两件事(由于看不到您所看到的内容,因此我无法直接在您的桌面编辑器中说出什么内容。)

  1. console.log(object)不会在记录时显示您对象的值 ,而是显示一个三角形,它实际上是指向该对象的一个​​指针,直到您实际求值单击它,到此为止的时间已被完全填满。要使console.log在记录日志时为您提供值(即时间快照),只需将语句更改为:console.log("data", JSON.stringify(data))。在this question and its answers中有更多相关内容。
  2. 如果进行更改,您将开始看到实际发生的情况,它正在慢慢构建您要寻找的内容,并且直到最后一次发射(即:完成)才真正完成。这也清楚地表明,解决问题的方法是在last()之后添加运算符mergeScan()

从CodeSandbox中完成代码:

of(incoming)
  .pipe(
    switchMap(from),
    groupBy(value => value.parent_id),
    mergeScan((memo, group$) => {
      const key = group$.key;

      return group$.pipe(
        map(value => {
          if (!(key in memo)) {
            memo[key] = [];
          }
          memo[key].push(value);

          return memo;
        })
      );
    }, {}),
    last()
  )
  .subscribe(data => console.log("data", JSON.stringify(data, null, 2)));