Angular 5, Как разместить блокировку для http звонков - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть реализация клиента веб-сокета. Он слушает сервер 1 для ответов. Как только клиент получает ответ от сервера 1. Он подключается к другому серверу 2 через http, чтобы получить объекты. Я смотрю синхронные звонки на сервер 2. Может кто-нибудь подсказать, пожалуйста, как этого можно добиться?

Пример кода: здесь клиент слушает сервер 1.

this.chatSubscription = this.stompClient.subscribe("/chat/" + id, (message) => {
  console.log(message.body);
  this.store.dispatch(new NotificationActions.TryNotificationsList({
    url: this.utilService.host + 'message'
  }));
});

Код эффектов: здесь клиент подключается к серверу 2 через http для получения объектов. Вот где я пытаюсь поставить блокировку, чтобы к серверу был установлен только один запрос 2.

@Effect({
  dispatch: false
})
actionTryNotificationsList = this.actions$
  .ofType(NotificationActions.TRY_NOTIFICATIONS_LIST)
  .switchMap((actions: NotificationActions.TryNotificationsList) => {
      const data = actions.payload;
      return this.requestsService.getRequest(data.url)
        .pipe(catchError(this.requestsService.handleError < any > ('Unable to connect to server')))
        .map((response: any) => {

            if (response instanceof HttpResponse) {
              if (response) {
                this.displayNotificationService.notificationsList$.next(notificationsList);
              }
          }
         }

код для функции getRequest:

                getRequest(url: string) {
                  const tkn = this.cookieService.get("token");
                  const httpOptions = {
                    observe: 'body',
                    responseType: 'json',
                    headers: new HttpHeaders({
                      'token': tkn,
                      'Content-Type': 'text/plain'
                    })
                  };
                  const req = new HttpRequest("GET", url, httpOptions);
                  return this.httpClient.request(req);
                }

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Пожалуйста, укажите мне, как я могу реализовать блокировку. Любая помощь очень ценится.

1 Ответ

0 голосов
/ 17 сентября 2018

Вы можете добавить еще одно поле в состояние, например serverCalled: boolean, которое вы измените на true в первый раз после этого эффекта (после получения данных с сервера 2). Кроме того, вы всегда можете проверить, запрашивали ли вы эти данные во время этой «сессии», в своем магазине. Или даже в вашем примере кода вы можете подписаться на изменения хранилища с помощью селектора, поэтому даже перед отправкой этого действия вы можете получить фактическое значение этой переменной и передать еще одно поле в полезной нагрузке, например shouldLoadData: true | false, так что фактически вы будете только проверить это и будет или не будет делать этот вызов в службу. Надеюсь, это поможет, по крайней мере, сейчас я так вижу.

...