RxJS 6 - Angular 6 - Правильно отменяет текущий HTTP-запрос, если новый запущен - PullRequest
0 голосов
/ 03 июля 2018

Так что я знаю, что это абсолютно возможно, но я никогда не использовал RxJs, кроме простых http get и подписок. У меня есть служба, которая прослушивает события WebSocket, когда срабатывает 1 такое событие, я вызываю Api для загрузки некоторых данных. Если это событие websocket срабатывает, когда 1 API уже находится в пути, я хочу отменить его, а затем перезапустить новый вызов API. Я не уверен, правильно ли я использую SwitchMap, и я теряюсь, как использовать Pipe с RxJs 6.

Это правильное использование SwitchMap и pipe для получения моих данных? Кажется, что он работает правильно при запуске большого количества событий, но, похоже, имеет большую задержку после того, как сработало последнее событие, однако это может привести к отставанию сервера, поскольку мой сервер API также является сервером веб-сокетов.

Мой компонент:

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 Ответ

0 голосов
/ 03 июля 2018

Ваш код описывает процесс отправки HTTP-запроса каждый раз, когда вы получаете OnClientUpdate наблюдаемый доход. Каждый выход заканчивается выбором наблюдаемой, которая представляет http-запрос. switchMap подпишется на этот наблюдаемый http-запрос и распоряжается своей подпиской на любой предыдущий наблюдаемый http-запрос. Если подписка этой наблюдаемой должным образом реализует удаление http-запроса, switchMap будет работать как задумано.

Однако, в зависимости от того, как часто OnClientUpdate может дать , вы можете захотеть добавить операцию debounce, тем самым предотвращая быстрый http-запрос и отмены.

Пример - don't spam, cancel all but the latest request, and yield each latest result:

var latestHttpRequestResult =
    trigger
        .pipe(debounce(200))
        .pipe(switchMap(sendHttpRequestAsObservable));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...