【问题标题】:Upgrading from RxJS5 to RxJS6从 RxJS5 升级到 RxJS6
【发布时间】:2018-12-19 05:33:15
【问题描述】:

我在从 RxJS5 升级到版本 6 时遇到问题。我有以下代码:

  private captureEvents(canvasEl: HTMLCanvasElement) {

    Observable
      .fromEvent(canvasEl, 'mousedown')
      .switchMap((e) => {
        return Observable
          .fromEvent(canvasEl, 'mousemove')
          .takeUntil(Observable.fromEvent(canvasEl, 'mouseup'))
          .pairwise()
      })
      .subscribe((res: [MouseEvent, MouseEvent]) => {
        const rect = canvasEl.getBoundingClientRect();

        const prevPos = {
          x: res[0].clientX - rect.left,
          y: res[0].clientY - rect.top
        };

        const currentPos = {
          x: res[1].clientX - rect.left,
          y: res[1].clientY - rect.top
        };

        this.drawOnCanvas(prevPos, currentPos);
      });
  }

但是当我升级到 RxJS6 时出现以下错误:

“typeof Observable”类型上不存在属性“fromEvent”。

我试图从这个 (RxJS5) 更改我的导入:

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/fromEvent';
import 'rxjs/add/operator/takeUntil';
import 'rxjs/add/operator/pairwise'; 
import 'rxjs/add/operator/switchMap';

对此(RxJS6):

import { Observable, fromEvent } from 'rxjs';
import { switchMap, takeUntil, pairwise } from 'rxjs/operators';

这是我升级代码的最佳尝试:

  private captureEvents(canvasEl: HTMLCanvasElement) {

    const obsMouseDown = fromEvent(canvasEl, 'mousedown').pipe(
      switchMap((e) => {
        const obsMouseMove = fromEvent(canvasEl, 'mousemove').pipe(
          takeUntil(a => {
            const obsMouseUp = fromEvent(canvasEl, 'mouseup').pipe(
              pairwise()
            );
            return obsMouseUp;
          }));

        return obsMouseMove;
      }))
      .subscribe((res: [MouseEvent, MouseEvent]) => {
        const rect = canvasEl.getBoundingClientRect();

        const prevPos = {
          x: res[0].clientX - rect.left,
          y: res[0].clientY - rect.top
        };

        const currentPos = {
          x: res[1].clientX - rect.left,
          y: res[1].clientY - rect.top
        };

        this.drawOnCanvas(prevPos, currentPos);
      });
  }

但这不起作用 - 我收到“takeUntil”代码错误:

'(a: any) => Observable' 类型的参数不是 可分配给“可观察”类型的参数

plnkr 原始代码示例:
https://embed.plnkr.co/QSvJxi/

【问题讨论】:

    标签: angular5 observable rxjs5 angular6 rxjs6


    【解决方案1】:

    我认为您实际上非常接近,但我认为您的管道太“深”了 - 请记住,您可以在管道中将任意数量的运算符链接在一起,因此您的内部鼠标移动直到鼠标向上switchmap 应该看起来更像这样:

    private captureEvents(canvasEl: HTMLCanvasElement) {
    
        const obsMouseDown = fromEvent(canvasEl, 'mousedown').pipe(
            switchMap((e) => {
                return fromEvent(canvasEl, 'mousemove').pipe(
                  takeUntil(a => fromEvent(canvasEl, 'mouseup')),
                  pairwise()
                ));
            }))
            .subscribe((res: [MouseEvent, MouseEvent]) => {
                // snip
            });
    }
    

    【讨论】:

      【解决方案2】:

      由于某种原因,您的 plnkr 对我不起作用,但我会尽力提供答案。我认为你应该在这里做两件事。尝试初始化您的 Observable,以便更轻松地调用和订阅它们,如下所示:

      const mousedown$ = fromEvent(pauseButton, 'mousedown');
      const mouseup$ = fromEvent(resumeButton, 'mouseup');
      const mousemove$ = fromEvent(resumeButton, 'mousemove');
      

      您现在应该使用 Rxjs 5 和 6 来管道您的操作符,就像这样,并订阅您的所有事件

      mousedown$.pipe(
          switchMap(res => {
             mousemove$.pipe(//Whatever Operators and subscribitions to other events).subscribe(...)
          }),
          map(// Whatever you want back from your event)
        ).subscribe(...)
      

      我参考你的文档链接 switchMap && takeUntil 。由于 Rxjs 中的许多语法正在发生变化,请不要害羞地浏览文档,没有比这更好的了。

      【讨论】:

      • 我想我实际上正在努力解决的问题是这两个事件的结合——在我之前的示例中,使用了新的管道处理方式:-s
      【解决方案3】:
      fromEvent 
      

      Now 已经是 Observable 类型了。您不需要将它链接到 Observebal,而是可以直接调用它并将其影响到变量或更好的 const。如下:

      const source = fromEvent(document, 'click');
      

      至于导入,你猜对了

      import { fromEvent } from 'rxjs';
      

      【讨论】:

      • 嘿,感谢您的提醒 - 我在链接多个事件(mouseDown、mouseMove)等时遇到的问题比实际的 fromEvent 更多。
      猜你喜欢
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 2020-04-17
      • 2013-07-01
      • 2020-09-15
      • 1970-01-01
      相关资源
      最近更新 更多