我具有返回数据的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
答案 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请求返回的数据。