如何快速防止Angular切换路由?

时间:2020-04-25 16:47:00

标签: angular angular6 angular8

我听路由:

this.route.paramMap
      .pipe(switchMap((parameters) => of(parameters)))
      .subscribe((params: Params) => {

       if (params.has("id")) {
         // Request to server
       }

       if (params.has("block")) {
         // Just add to array
       }

       if (params.has("request")) {
         // Request to server
       }
});

当我快速来回切换路由时,它在if (params.has("id")) {}if (params.has("request")) {}部分中向服务器发送了很多请求。

如何避免这种情况以及为什么.pipe(switchMap((parameters) => of(parameters)))不起作用?

2 个答案:

答案 0 :(得分:0)

您可以订阅路由器事件并在导航开始时编写逻辑

import {
  Router,
  // import as RouterEvent to avoid confusion with the DOM Event
  Event as RouterEvent,
  NavigationStart,
  NavigationEnd,
  NavigationCancel,
  NavigationError
} from '@angular/router';

this.router.events.subscribe((event: RouterEvent) => {
    if (event instanceof NavigationStart) {
      // you can write your logic to stop what you want to stop
    }
});

答案 1 :(得分:0)

它需要更像这样:

  this.route.paramMap.pipe(
    switchMap((parameters) => {
      if (params.has("id") {
        return this.serverRequest(params); // return the request, possibly add .pipe() if needed
      } else if (params.has("block")) {
        return of(params); // add to array here and return whatever
      } else if (params.has("request")) {
        return this.serverRequest(params); // return the request, possibly add .pipe() if needed
      }

      return of(params); // whatever default return here
    })
  ).subscribe((result) => {
    //handle your result

  });

switchMap不会取消最终订阅中发生的事情,它会取消内部可观测对象中发生的事情,因此内部可观测对象必须是您要取消的事情。通常,嵌套订阅是不好的做法,这意味着您做错了事。

如果您不希望在路由切换非常迅速的情况下发送请求,也可以考虑在debounceTime之前添加一个switchMap运算符。