Наблюдаемый rxjs: Используете какое-то ожидание? - PullRequest
0 голосов
/ 18 марта 2019

Я добавил перехватчик для моих HTTP-запросов, где я должен использовать токен доступа моего пользовательского экземпляра.В моем компоненте приложения я инициализирую моего пользователя:

app.component.ts

private async restoreUser(): Promise<UserModel | any> {
   // ... some view stuff

   return this.userService.restore()
      // login instance could be found
      .then(async () => {
         // ... some view stuff
      })

      // local storage is empty -> login is necessary
      .catch(async () => {
         // ... some view stuff

         this.subscription = this.networkSrv.getNetworkStatus()
            .subscribe((status: ConnectionStatus) => {
               if (status === ConnectionStatus.Online) {
                  // ... some view stuff
               } else {
                  // ... some view stuff
               }
            });
      });
}

http.interceptor.ts

return this.userSrv.user.pipe(
   map((user: UserModel) => request.clone(
      {setParams: {'access-token': user.accessToken}}
   )),
   mergeMap(request => next.handle(request))
);

Теперь я хотел бы сделатьзапрос по инициализации моего приложения.Проблема в том, что пользовательский экземпляр пуст и приложение выдает ошибку.Есть ли способ сделать что-то вроде await ->, чтобы пользовательский экземпляр был установлен?

Пример:

this.transmissionSrv.restoreQueue().then((projects: ProjectModel[]) => {
   this.transmissionSrv.transmitProjects(projects, true).subscribe(console.log);
});

В настоящее время я использую setTimeout -метод, ноэто не так, как я должен это делать, верно?Кроме того, извините за непоследовательность при использовании Observer;Ionic часто использует Promises (?)

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Существует несколько способов решения этой проблемы.

  1. Синхронно: используйте Angular APP_INITIALIZER (см. здесь ), чтобы выполнить внутренний вызов и убедиться, что пользовательобъект присутствует, когда приложение загружается.
  2. Асинхронно: измените существующее приложение, чтобы хранить экземпляр пользователя в RxJs BehaviorSubject где-то в службе и иметь компоненты, которые зависят от него, подписаться на этот BehaviorSubject везде, гденужен пользовательский экземпляр.Когда служба создаст, сделайте так, чтобы она сделала внутренний вызов и вставила завершенный пользовательский экземпляр в BehaviorSubject (userSubject.next(user)), когда она будет завершена.
1 голос
/ 18 марта 2019

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

return this.userSrv.user.pipe(
   filter(Boolean),
   map((user: UserModel) => request.clone(
      {setParams: {'access-token': user.accessToken}}
   )),
   mergeMap(request => next.handle(request))
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...