Angular 解决不';不要等到API调用完成后才进入函数末尾

Angular 解决不';不要等到API调用完成后才进入函数末尾,angular,angular-router,Angular,Angular Router,我正在制作一个有棱角的网络应用程序。我有一个页面在显示之前需要等待数据,所以我使用的是resolve。首先解析检查数据在存储器中是否可用,如果可用,则检查路由和数据中的ID是否匹配,如果不匹配,则从API检索数据,最后如果数据在存储器中不存在,则从API检索数据。但是,如果进行API调用,函数总是会终止。我做错了什么 resolve(route: ActivatedRouteSnapshot): Observable<PDataInterface> { const routeID

我正在制作一个有棱角的网络应用程序。我有一个页面在显示之前需要等待数据,所以我使用的是resolve。首先解析检查数据在存储器中是否可用,如果可用,则检查路由和数据中的ID是否匹配,如果不匹配,则从API检索数据,最后如果数据在存储器中不存在,则从API检索数据。但是,如果进行API调用,函数总是会终止。我做错了什么

resolve(route: ActivatedRouteSnapshot): Observable<PDataInterface>
{
  const routeID = route.params.id;
  // get data from storage
  this.getData();
  if (!!this.pData) {
    if (this.pData.id == routeID) {
      return Observable.of(this.pData);
    } else {
      this.API.getInfo(this.routeID).subscribe((data) => {
        this.pData = data;
        return Observable.of(this.pData);
      });
    }
  } else {
    this.API.getInfo(this.pData.id).subscribe((data) => {
      this.pData = data;
      return Observable.of(this.pData);
    });
  }
  // function always comes here if API calls are made
  console.log("failed resolve");
  this.router.navigate(['/dashboard']);
}
这是在
getInfo()
中调用的
refreshtToken()。如果JWT令牌在向后端D发出请求之前过期,它将刷新我的JWT令牌

refreshToken(): Observable<any>
{
  const URL = `${this.API}/refresh?token=${this.token}`;
  if (this.jwtHelper.isTokenExpired(this.token)) {
    return this.authHttp.get(URL)
      .map((rsp) =>
        {
          this.setToken(rsp.json().token);
          this.authNotifier.next(true);
          return rsp.json().token;
        },
        err =>
        {
          this.authNotifier.next(false);
          this.logout();
          console.log(err);
        })
      .share();
  }
  else { return Observable.of(this.token); }
}

当您订阅api时,您的api将被激发,但其余的解析代码将继续执行。这就是为什么它不断到达您的
console.log(“解析失败”)。相反,您应该返回api observable并让解析器执行订阅

resolve(route: ActivatedRouteSnapshot): Observable<PDataInterface>
{
    const routeID = route.params.id;
    // get data from storage
    this.getData();
    if (!!this.pData) {
        if (this.pData.id == routeID) {
            return Observable.of(this.pData);
        } else {
            return this.API.getInfo(this.routeID);
        }
    } else {
        return this.API.getInfo(this.pData.id);
    }
}
resolve(路由:ActivatedRouteSnapshot):可观察
{
const routeID=route.params.id;
//从存储器中获取数据
这是getData();
如果(!!this.pData){
if(this.pData.id==routeID){
(本数据)的可观测返回值;
}否则{
返回this.API.getInfo(this.routeID);
}
}否则{
返回this.API.getInfo(this.pData.id);
}
}

当您订阅api时,您的api将被触发,但其余的解析代码将继续执行。这就是为什么它不断到达您的
console.log(“解析失败”)。相反,您应该返回api observable并让解析器执行订阅

resolve(route: ActivatedRouteSnapshot): Observable<PDataInterface>
{
    const routeID = route.params.id;
    // get data from storage
    this.getData();
    if (!!this.pData) {
        if (this.pData.id == routeID) {
            return Observable.of(this.pData);
        } else {
            return this.API.getInfo(this.routeID);
        }
    } else {
        return this.API.getInfo(this.pData.id);
    }
}
resolve(路由:ActivatedRouteSnapshot):可观察
{
const routeID=route.params.id;
//从存储器中获取数据
这是getData();
如果(!!this.pData){
if(this.pData.id==routeID){
(本数据)的可观测返回值;
}否则{
返回this.API.getInfo(this.routeID);
}
}否则{
返回this.API.getInfo(this.pData.id);
}
}

可能读过异步javascript,应该读到结尾可能读过异步javascript,应该读到结尾谢谢。我将我的API调用与
refreshtToken()
一起添加到OP中,如果jwt令牌在调用API之前过期,它将刷新jwt令牌。我是否必须修改它以返回可观察到的?因为我必须订阅it@derrickrozay看起来
refreshttoken()
方法确实返回了一个可观察的。然后,您将链接refreshToken observable和authHttp.get observable。总的来说,解析是接收一个可观察的序列,这是正确的。目前我返回
pData
,这是一个数组,我可以在我的组件中访问它。如果我按照您建议的方式操作,我将如何访问数据?我只是在
getInfo()
中使用map,我仍然需要订阅它,否则它永远不会成功request@derrickrozay通过您的设置,路由器知道如何订阅预解决服务的解决方法。因此,您在解析方法中返回的任何可观察结果都将被订阅,并且结果将返回到pDataWow,因为它可以工作!最酷的是pData最初来自会话存储,在我的组件中,当我检索pData并将其分配给另一个pData变量时,它会自动更新会话存储!我不知道这是可能的,也不知道它是如何做到的,但它省去了我的工作!谢谢我将我的API调用与
refreshtToken()
一起添加到OP中,如果jwt令牌在调用API之前过期,它将刷新jwt令牌。我是否必须修改它以返回可观察到的?因为我必须订阅it@derrickrozay看起来
refreshttoken()
方法确实返回了一个可观察的。然后,您将链接refreshToken observable和authHttp.get observable。总的来说,解析是接收一个可观察的序列,这是正确的。目前我返回
pData
,这是一个数组,我可以在我的组件中访问它。如果我按照您建议的方式操作,我将如何访问数据?我只是在
getInfo()
中使用map,我仍然需要订阅它,否则它永远不会成功request@derrickrozay通过您的设置,路由器知道如何订阅预解决服务的解决方法。因此,您在解析方法中返回的任何可观察结果都将被订阅,并且结果将返回到pDataWow,因为它可以工作!最酷的是pData最初来自会话存储,在我的组件中,当我检索pData并将其分配给另一个pData变量时,它会自动更新会话存储!我不知道这是可能的,也不知道它是如何做到的,但它省去了我的工作!
resolve(route: ActivatedRouteSnapshot): Observable<PDataInterface>
{
    const routeID = route.params.id;
    // get data from storage
    this.getData();
    if (!!this.pData) {
        if (this.pData.id == routeID) {
            return Observable.of(this.pData);
        } else {
            return this.API.getInfo(this.routeID);
        }
    } else {
        return this.API.getInfo(this.pData.id);
    }
}