【问题标题】:Piping of RxJs OperatorsRxJs 操作符的管道
【发布时间】:2021-04-21 20:55:46
【问题描述】:

我尝试学习 RxJs。我想用它来拖放对象。我设法做到了。但我正在创建以下drag$ Observable:

const drag$ = mousedown$.pipe(
      switchMap((start) => {
        return merge(
          mousemove$.pipe(
            map((move) => {
              move.preventDefault();
              return {
                type: "move",
                x: move.x - start.x,
                y: move.y - start.y,
              };
            }),
            takeUntil(mouseup$)
          ),
          mouseup$.pipe(
            map((endPos) => {
              return {
                type: "end",
                x: endPos.clientX,
                y: endPos.clientY,
              };
            }),
            take(1)
          )
        );
      })
    );

困扰我的是,我将merge 运算符用作接收两个可观察对象作为参数的运算符。在管道内执行合并时,是否有一种优雅的方式来重新定义相同的 drag$ 运算符?

【问题讨论】:

标签: javascript reactjs typescript rxjs


【解决方案1】:

也许您可以使用mergeWith operator(自 RxJS 7.x AFAIK 起可用):

const drag$ = mousedown$.pipe(
  switchMap((start) =>
    mousemove$.pipe(
      map((move) => {
        move.preventDefault();
        return {
          type: "move",
          x: move.x - start.x,
          y: move.y - start.y,
        };
      }),
      takeUntil(mouseup$),
      mergeWith(
        mouseup$.pipe(
          map((endPos) => {
            return {
              type: "end",
              x: endPos.clientX,
              y: endPos.clientY,
            };
          }),
          take(1)
        )
      )
    )
  )
);

【讨论】:

  • 不确定:mousemove$ 管道以mouseup$ 事件终止,对吗?对我来说重要的是,生成的 drag$ observable 也会发出最终的 mouseup$ 事件。
  • RxJS 7.x 还是测试版吗?我使用 yarn 安装 RxJs,但它是 6.6.3 版。
  • 我会说是的。但请注意,mouseup$ observable 将被订阅两次。该功能应该与您的 sn-p 中的功能相同。是的.. 看起来 RxJS 7.x 是 beta.9
  • 你可以这样做(在整个流之前):mouseup$ = mouseup$.pipe(share())。这将只订阅一次主源,但 share() 将在其间添加一个 Subject 实例,并且该主题将有 2 个观察者。但是源还是订阅了一次。
  • 视情况而定,有时是的。在这种情况下,我会说这不是很成问题,但是您正在创建 2 个事件侦听器,其中 1 个就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 2021-12-01
相关资源
最近更新 更多