Почему я получаю неопределенный результат от Promise? - PullRequest
0 голосов
/ 31 октября 2018

У меня есть функция 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 голосов
/ 31 октября 2018

Извините, что поставил это в ответ, это просто много кода, так что ...

но вы можете вернуть 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();

Я знаю, что это не обещание, поэтому, возможно, это не тот путь, по которому вы хотите идти, но это вариант.

EDIT:

Если вам нужно объединить запросы в цепочку, вы можете сделать что-то вроде этого, в этом примере я «создаю профиль», затем звоню, чтобы получить только что созданный профиль.

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

В этом сценарии, когда вы вызываете первый http, вы используете метод наблюдаемого канала rxjs, затем http.post возвращает данные, которые он передаст в качестве параметра в метод switchMap (импортированный из 'rxjs / operator'), метод switchMap затем возвращает второй вызов http.get.

В результате, когда вы вызываете onChainingRequests (), возвращаемые данные - это то, что возвращается из второго http-запроса.

...