为什么我从 Promise 得到未定义的结果?
Why do I get undefined result from Promise?
我有 return 数据的 Promise 函数:
private initializePeriod(profile: Profile): Promise <any> {
return this.educationPeriod.getCurrentStudyPeriodPromise(profile.organization.id);
}
其中 getCurrentStudyPeriodPromise()
得到 returns:
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({'a': 1});
上替换了 resolve(r);
,它起作用了。
所以,这意味着 getCurrentStudyPeriodPromise
return 的错误承诺,returnundefined
很抱歉把这个放在一个答案中它只是很多代码所以...
但你可以 return 一个 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();
我知道这不是一个承诺,所以它可能不是你想要的方式,但它是一个选择。
编辑:
如果您需要将请求链接在一起,您可以这样做,在这个例子中,我 "creating a profile" 然后调用以获取刚刚创建的配置文件。
onChainingRequests(): Observable<any> {
return this.http.post('profile/create', profile).pipe(
switchMap(createdProfileData => this.http.get(`getProfile?profileId=${createdProfileData.id}`));
)
}
在这种情况下,当您调用第一个 http 时,您使用 rxjs 可观察管道方法,然后是 http.post returns 数据,它将作为参数提供给 switchMap 方法(从'rxjs/operators') switchMap 方法然后 return 第二次 http.get 调用。
结果是当您调用 onChainingRequests() 时,returned 数据是来自第二个 http 请求的 returned 数据。
我有 return 数据的 Promise 函数:
private initializePeriod(profile: Profile): Promise <any> {
return this.educationPeriod.getCurrentStudyPeriodPromise(profile.organization.id);
}
其中 getCurrentStudyPeriodPromise()
得到 returns:
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({'a': 1});
上替换了 resolve(r);
,它起作用了。
所以,这意味着 getCurrentStudyPeriodPromise
return 的错误承诺,returnundefined
很抱歉把这个放在一个答案中它只是很多代码所以...
但你可以 return 一个 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();
我知道这不是一个承诺,所以它可能不是你想要的方式,但它是一个选择。
编辑:
如果您需要将请求链接在一起,您可以这样做,在这个例子中,我 "creating a profile" 然后调用以获取刚刚创建的配置文件。
onChainingRequests(): Observable<any> {
return this.http.post('profile/create', profile).pipe(
switchMap(createdProfileData => this.http.get(`getProfile?profileId=${createdProfileData.id}`));
)
}
在这种情况下,当您调用第一个 http 时,您使用 rxjs 可观察管道方法,然后是 http.post returns 数据,它将作为参数提供给 switchMap 方法(从'rxjs/operators') switchMap 方法然后 return 第二次 http.get 调用。
结果是当您调用 onChainingRequests() 时,returned 数据是来自第二个 http 请求的 returned 数据。