У меня есть функция обещания, которая возвращает данные:
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
.
Хорошо, код: public getCurrentStudyPeriodPromise(schoolId: number): Promise<any> { const data = { '$type': 'ReadRequest', 'query': 'getCurrentStudyPeriod', 'parameters': {'school': schoolId} }; return this.http.post('', data).toPromise(); }
Я обновил вопрос с методом
Мне это не похоже на Javascript ... что это?
Это TypeScript (Angular), Rxj
Вы уверены, что обещание, возвращаемое this.http.post('', data).toPromise();
, разрешает нечто иное, чем undefined
?
Вы имеете в виду, что мне нужно использовать then
мгновенно после .toPromise();
? И вернуть готовый результат?
Вы знаете, проблема в return this.http.post('', data).toPromise();
Я это проверил
что ты имеешь в виду? Вы говорите, что toPromise
возвращает обещание, которое разрешает undefined
?
Я обновил вопрос с помощью макета, который я использовал для тестов
.then(r => { resolve({'a': 1});
, который выглядит так, как будто вы обертываете что-то, что возвращает Promise в конструкторе Promise ... то есть общий анти-шаблон
Как тогда использовать цепные обещания? В любом случае я должен вернуть обещание с данными
если this.http.post('', data).toPromise();
возвращает обещание (которое, похоже, так и должно), но это обещание разрешается в undefined
(что, похоже, так и есть), то не уверен, что вы можете с этим поделать ... что такое this.http.post
- откуда взялась эта функция?
Это происходит из HttpClient
в Angular 7
Myabe не поддерживается в новом Angular, я имею в виду Promises для httpClient
Я проверил нотацию http.post
, она действительно не поддерживает Promise, как быть, если мне нужно последовательно выполнять действия, сначала выполнять собственные вычисления, а затем вызывать метод, в конечном итоге возвращать результат как Promise
Извините, что вставил это в ответ, это просто много кода, так что ...
но вы можете вернуть 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})
Вы решили эту проблему? Потому что вы можете изменять запросы вместе, используя метод pipe.
Невозможно сказать, не увидев кода в
getCurrentStudyPeriodPromise()
, который на самом деле является решает Promise.