Угловое - дождитесь завершения работы перед навигацией

Я пытаюсь установить данные в службе, а затем перемещаться после того, как данные были заполнены службой, у меня возникает проблема синхронизации, когда страница перемещается до того, как служба была заполнена.

] У меня есть следующий код в службе

addToken(token) {
  this.cookieService.set( 'token', token );
}

и следующий код при нажатии кнопки: -

this.token.addToken(res);
this.router.navigate(['/admin']);

После запуска маршрутизатора запускаются триггеры / admin конечная точка со следующими заголовками: -

authHttpHeaders = new HttpHeaders({
    'Authorization': 'Bearer ' + this.token.getToken(),
    'Content-Type' : 'application/json',
    'Cache-Control': 'no-cache'
});

Функция getToken () просто получает маркер из файла cookie: -

getToken() {
  return this.cookieService.get('token');
}

Как я могу обеспечить addToken () (! d5)

Я знаю, что могу добиться этого с помощью setTimeout, но мне это не нравится.

Я бы предпочел иметь какую-то форму наблюдаемого или способа увидеть, что токен не равен нулю или пуст до запуска навигационного маршрутизатора.

Спасибо за помощь.

1
задан 13 August 2018 в 16:00

1 ответ

Возвратите наблюдаемое, чтобы вы могли подписаться на него и дождаться окончания действия службы и отфильтровать ответ, чтобы отменить, когда токен является ложным.

addToken(token) {
  this.cookieService.set( 'token', token );
  return of(token);
}
this.token.addToken(res)
.pipe(filter(res => !!res))
.subscribe(() => {
  this.router.navigate(['/admin']);
});
5
ответ дан 15 August 2018 в 17:01
  • 1
    @Faisal сделайте свой собственный ответ вместо того, чтобы модифицировать мой, пожалуйста. Если бы я не говорил о обещаниях, у меня есть свои причины. – trichetriche 13 August 2018 в 15:29
  • 2
    Я отредактировал ваш, потому что думал, что нет необходимости добавлять еще один ответ, так или иначе забыть об этом. – Faisal 13 August 2018 в 15:31
  • 3
    Это очень хорошо благодарит вас, но я получаю следующую ошибку: Shadowed name: 'res' (no-shadowed-variable). Есть ли способ разрешить это? – Angular Developer 13 August 2018 в 15:32
  • 4
    @AngularDeveloper filter(response => !!response) будет делать – trichetriche 13 August 2018 в 15:33
  • 5
    Попытки @Faisal не позволяют создавать трубопроводы и фильтровать пустые результаты. И даже если бы это произошло, вместо возврата new Promise вы могли бы использовать метод разрешения прототипа обещания, который становится более понятным и понятным: return Promise.resolve(token). – trichetriche 13 August 2018 в 15:36

Другие вопросы по тегам:

Похожие вопросы: