为什么我从 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 数据。