Как ждать, пока одна и та же наблюдаемая закончится, если вызывается дважды по угловому? - PullRequest
0 голосов
/ 20 декабря 2018

Мой вопрос не совпадает с тем, как "Как ждать, пока наблюдаемое закончится".Я уже решил эту проблему в своем коде с помощью switchMap.В настоящее время у меня есть вызов API api, который перед выполнением httpget проверит, не истек ли срок действия refreshToken, в этом случае он сгенерирует новый токен и подождет его, а затем выполнит httpget, что отлично.

Myпроблема в том, что если у меня есть следующее senario:

this.getUsers();
this.getLocations();

Давайте возьмем случай, когда токен нуждается в обновлении (нам нужно дождаться обновления): сначала мы вызываем this.getUsers (), это вызоветсоздать новый токен, и получение пользователей произойдет после того, как токен будет создан.Параллельно мы также вызываем this.getLocations (), который также будет инициировать создание нового токена и НЕ ЖДЕТ для первого завершения.Мне нужно найти способ, чтобы 2-е получение дожидалось окончания первого, чтобы оба использовали один и тот же новый токен.

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Чтобы отправить два запроса параллельно и подождать, пока оба не будут выполнены (код из головы):

let [users, locations] = await Promise.all([
  this.getUsers().toPromise(),
  this.getLocations().toPromise()
]);
// `users` and `locations` are ready to use here

Однако, если вы хотите отправить первый запрос и когда он закончится, отправьте второй, затем используйте:

let users = await this.getUsers().toPromise(),
let locations= await this.getLocations().toPromise();

Я предполагаю, что ваши функции this.getUsers() и this.getLocations() возвращают угловые http.get(...) наблюдаемые (не забудьте поставить ключевое слово async рядом с именем функции, использующей вышеуказанные коды).Подробнее об обещаниях здесь .

0 голосов
/ 22 декабря 2018

Ни один из этих ответов не помог с моей проблемой.Проведя дополнительные исследования, я смог добиться того, что хочу, используя функцию rxjs share (), которая позволяла нескольким вызывающим сторонам совместно использовать одну и ту же наблюдаемую информацию, и, следовательно, токен обновлялся только один раз.

getUsers (); запросит токен обновления, затем выполните httpget. getLocation (); обнаружит, что запрашивается токен обновления, и, следовательно, будет использовать тот же самый наблюдаемый объект и не будет запрашивать новый токен.

0 голосов
/ 20 декабря 2018
Оператор

rxjs для использования в этом сценарии: forkJoin().

Observable.forkJoin(
    this.http.get('/app/getUser').map((res: Response) => res.json()),
    this.http.get('/app/getLocation').map((res: Response) => res.json())
).subscribe(
  data => {
    this.users = data[0]
    this.locations = data[1]
  },
  err => console.error(err)
);

См. Этот пример: Пример stackoverflow

Также смотрите это, чтобы принятьпреимущество Observable в Angular: Take Advantage of Observable

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...