Почему я получаю неопределенный результат от 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.info(currentPeriod);
});

Почему я могу undefined в console.info вместо данных из ответа?

Запрос метода:

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.

Невозможно сказать, не увидев кода в getCurrentStudyPeriodPromise(), который на самом деле является решает Promise.

Pointy 31.10.2018 00:20

Хорошо, код: public getCurrentStudyPeriodPromise(schoolId: number): Promise<any> { const data = { '$type': 'ReadRequest', 'query': 'getCurrentStudyPeriod', 'parameters': {'school': schoolId} }; return this.http.post('', data).toPromise(); }

OPV 31.10.2018 00:25

Я обновил вопрос с методом

OPV 31.10.2018 00:26

Мне это не похоже на Javascript ... что это?

jrader 31.10.2018 00:27

Это TypeScript (Angular), Rxj

OPV 31.10.2018 00:27

Вы уверены, что обещание, возвращаемое this.http.post('', data).toPromise();, разрешает нечто иное, чем undefined?

Bravo 31.10.2018 00:33

Вы имеете в виду, что мне нужно использовать then мгновенно после .toPromise();? И вернуть готовый результат?

OPV 31.10.2018 00:38

Вы знаете, проблема в return this.http.post('', data).toPromise(); Я это проверил

OPV 31.10.2018 00:50

что ты имеешь в виду? Вы говорите, что toPromise возвращает обещание, которое разрешает undefined?

Bravo 31.10.2018 00:58

Я обновил вопрос с помощью макета, который я использовал для тестов

OPV 31.10.2018 01:03
.then(r => { resolve({'a': 1});, который выглядит так, как будто вы обертываете что-то, что возвращает Promise в конструкторе Promise ... то есть общий анти-шаблон
Bravo 31.10.2018 01:06

Как тогда использовать цепные обещания? В любом случае я должен вернуть обещание с данными

OPV 31.10.2018 01:08

если this.http.post('', data).toPromise(); возвращает обещание (которое, похоже, так и должно), но это обещание разрешается в undefined (что, похоже, так и есть), то не уверен, что вы можете с этим поделать ... что такое this.http.post - откуда взялась эта функция?

Bravo 31.10.2018 01:09

Это происходит из HttpClient в Angular 7

OPV 31.10.2018 01:13

Myabe не поддерживается в новом Angular, я имею в виду Promises для httpClient

OPV 31.10.2018 01:22

Я проверил нотацию http.post, она действительно не поддерживает Promise, как быть, если мне нужно последовательно выполнять действия, сначала выполнять собственные вычисления, а затем вызывать метод, в конечном итоге возвращать результат как Promise

OPV 31.10.2018 01:45
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
16
329
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.info(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, тогда http.post возвращает данные, которые он будет передавать в качестве параметра в метод switchMap (импортированный из 'rxjs / operator'), метод switchMap затем возвращает второй вызов http.get.

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

Я знаю, но мне нужно использовать цепочку Promise, и моя вторая цепочка должна быть Promise, которая возвращает Promise с данными из метода getCurrentStudyPeriodPromise(). Я не могу использовать Observer внутри Promise, например: new Promise({//Here call Observer method and get data})

OPV 31.10.2018 01:02

Вы решили эту проблему? Потому что вы можете изменять запросы вместе, используя метод pipe.

Woot 31.10.2018 16:55

Другие вопросы по теме