代码之家  ›  专栏  ›  技术社区  ›  Bailey Miller

RXJS 6-角度6-如果触发新HTTP请求,则正确取消当前HTTP请求

  •  2
  • Bailey Miller  · 技术社区  · 7 年前

    所以我知道这是完全可能的,但我从来没有使用过RXJS,除了简单的HTTPGET和SUBSCRIBE。我有一个正在监听WebSocket事件的服务,当1个此类事件触发时,我调用API来加载一些数据。如果WebSocket事件在1 API已经在传输过程中触发,我想取消它,然后重新启动一个新的API调用。我不确定是否正确使用了switchmap,也不知道如何将pipe与rxjs 6结合使用。

    这是正确使用switchmap和pipe来获取我的数据吗?当触发大量事件时,它似乎工作正常,但在触发最后一个事件后似乎有很长的延迟,但这可能是服务器延迟,因为我的API服务器也是我的WebSocket服务器。

    我的组件:

    clients: Client[] = [];
    
      constructor(public statsApi: StatisticsService)
      {
        this.statsApi.OnClientUpdate.pipe(switchMap(x => { return this.statsApi.GetClients() })).subscribe(x =>
        {
          console.log(x);
          this.LoadClients(x);
        });
      }
    
      private LoadClients(clients:Client[] = null): void
      { 
        if (clients != null)
        { 
          this.clients = clients;
        } else
        { 
          this.statsApi.GetClients().subscribe(data =>
          {
            this.clients = data;
          });
        }
      }
    
      ngOnInit() 
      {
        this.LoadClients();
      }
    

    getclients服务内部:

    public GetClients(): Observable<Client[]>
      { 
        return this.http.get<Client[]>('http://localhost:5000/api/client');
      }
    

    OnClientUpdate returns an Observable<number>

    1 回复  |  直到 7 年前
        1
  •  2
  •   cwharris    7 年前

    OnClientUpdate switchMap

    debounce

    don't spam, cancel all but the latest request, and yield each latest result

    var latestHttpRequestResult =
        trigger
            .pipe(debounce(200))
            .pipe(switchMap(sendHttpRequestAsObservable));