为什么我从Promise中得到未定义的结果?

时间:2018-10-30 23:16:26

标签: angular angular-promise angular7

我具有返回数据的Promise函数:

private initializePeriod(profile: Profile): Promise <any> {
    return this.educationPeriod.getCurrentStudyPeriodPromise(profile.organization.id);
}

getCurrentStudyPeriodPromise()获得退货的地方:

return this.http.post('', data).toPromise();

我称这个诺言为:

 return this.initializePeriod(profile)
                  .then((currentPeriod) => {
           console.log(currentPeriod);
});

为什么我可以在console.log中取消定义,而不是响应中的数据?

方法请求为:

public getCurrentStudyPeriodPromise(schoolId: number): Promise<any> {
 const data = { '$type': 'ReadRequest', 'query': 'getCurrentStudyPeriod', 'parameters': {'school': schoolId} }; 

return this.http.post('', data).toPromise(); } 

我试图使用Mockup对此进行测试:

private initializePeriod(profile: Profile): Promise <any> {
    return new Promise(resolve => {
       this.educationPeriod.getCurrentStudyPeriodPromise(profile.organization.id).then(r => {
            resolve({'a': 1});
          }), e => {
            reject(e);
          };
        });
      }

因此,我将resolve(r);上的resolve({'a': 1});替换了,并且有效。

所以,这意味着getCurrentStudyPeriodPromise返回了错误的承诺,它返回了undefined

1 个答案:

答案 0 :(得分:1)

很抱歉,答案只是很多代码,所以...

但是您可以返回一个Observable,然后订阅它

public getCurrentStudyPeriodPromise(schoolId: number): Observable<any> {
  const data = { '$type': 'ReadRequest', 'query': 'getCurrentStudyPeriod', 'parameters': {'school': schoolId} }; 

  return this.http.post('', data); 
}

private initializePeriod(profile: Profile): Observable<any> {
    return this.educationPeriod.getCurrentStudyPeriodPromise(profile.organization.id);
}

然后方法调用将是

this.subscription = this.initializePeriod(profile)
              .subscribe((currentPeriod) => {
       console.log(currentPeriod);
});

return this.subscription

只有一件事是您确实需要确定并取消订阅,因此稍后可以在ngOnDestroy生命周期挂钩中放入

this.subcrption.unsubscribe();

我知道这不是一个承诺,所以它可能不是您想要的方式,但这是一个选择。

编辑:

如果您需要将请求链接在一起,则可以执行以下操作,在此示例中,我正在“创建个人资料”,然后调用以获取刚刚创建的个人资料。

onChainingRequests(): Observable<any> {
  return this.http.post('profile/create', profile).pipe(
    switchMap(createdProfileData => this.http.get(`getProfile?profileId=${createdProfileData.id}`));
  )
}

在这种情况下,当您调用第一个http时,使用rxjs observable pipe方法,然后http.post返回数据,它将作为参数将其作为参数输入switchMap方法(从“ rxjs / operators”导入)switchMap方法然后返回第二个http.get调用。

结果是,当您调用onChainingRequests()时,返回的数据就是第二个http请求返回的数据。