【问题标题】:rxjs observable: Using some kind of await?rxjs observable:使用某种等待?
【发布时间】:2019-03-18 16:03:53
【问题描述】:

我为我的 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(?)

【问题讨论】:

    标签: javascript angular ionic-framework rxjs


    【解决方案1】:

    您应该尝试在地图之前添加过滤器。使用过滤器,在设置用户之前,您的地图不会被调用。

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

    【讨论】:

      【解决方案2】:

      有几种方法可以解决这个问题。

      1. 同步:使用 Angular APP_INITIALIZER(请参阅 here)进行后端调用,并确保在应用引导时用户对象存在。
      2. 异步:修改现有应用程序以将用户实例存储在 RxJs BehaviorSubject 的某个服务中,并让依赖它的组件在需要用户实例的地方订阅 BehaviorSubject。当服务构建时,让它进行后端调用,并在完成后将完成的用户实例粘贴到BehaviorSubject (userSubject.next(user)) 中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-16
        • 2021-08-28
        • 2017-09-04
        • 2021-12-03
        • 2021-11-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多