Posiadam funkcję Promise, która zwraca dane:
private initializePeriod(profile: Profile): Promise <any> {
return this.educationPeriod.getCurrentStudyPeriodPromise(profile.organization.id);
}
Gdzie getCurrentStudyPeriodPromise()
otrzymuje zwroty:
return this.http.post('', data).toPromise();
Nazywam tę obietnicę tak:
return this.initializePeriod(profile)
.then((currentPeriod) => {
console.log(currentPeriod);
});
Dlaczego mogę undefined w console.log zamiast danych z odpowiedzi?
Żądanie metody to:
public getCurrentStudyPeriodPromise(schoolId: number): Promise<any> {
const data = { '$type': 'ReadRequest', 'query': 'getCurrentStudyPeriod', 'parameters': {'school': schoolId} };
return this.http.post('', data).toPromise(); }
Próbowałem użyć Mockup do przetestowania tego:
private initializePeriod(profile: Profile): Promise <any> {
return new Promise(resolve => {
this.educationPeriod.getCurrentStudyPeriodPromise(profile.organization.id).then(r => {
resolve({'a': 1});
}), e => {
reject(e);
};
});
}
Zamieniłem więc resolve(r);
na resolve({'a': 1});
i działa.
Oznacza to, że getCurrentStudyPeriodPromise
zwraca niepoprawną obietnicę, zwraca undefined
1 odpowiedź
Przepraszam za umieszczenie tego w odpowiedzi, to po prostu dużo kodu, więc...
Ale możesz zwrócić Observable, a następnie zasubskrybować go
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);
}
Wtedy wywołanie metody będzie
this.subscription = this.initializePeriod(profile)
.subscribe((currentPeriod) => {
console.log(currentPeriod);
});
return this.subscription
Jedyną rzeczą jest to, że naprawdę musisz się upewnić i wypisać się, więc później w haczyku cyklu życia ngOnDestroy możesz umieścić
this.subcrption.unsubscribe();
Wiem, że to nie obietnica, więc może nie jest to droga, którą chcesz iść, ale jest to opcja.
EDYTOWAĆ:
Jeśli potrzebujesz połączyć żądania razem, możesz zrobić coś takiego, w tym przykładzie „tworzę profil”, a następnie dzwonię, aby uzyskać profil, który właśnie został utworzony.
onChainingRequests(): Observable<any> {
return this.http.post('profile/create', profile).pipe(
switchMap(createdProfileData => this.http.get(`getProfile?profileId=${createdProfileData.id}`));
)
}
W tym scenariuszu, gdy wywołasz pierwszy http, użyjesz metody potoku obserwowalnego rxjs, a następnie http.post zwróci dane, które przekażą jako parametr do metody switchMap (zaimportowanej z 'rxjs/operators'), a metoda switchMap następnie zwróci drugie połączenie http.get.
Rezultatem jest wywołanie onChainingRequests(), zwracane dane są tym, co zostało zwrócone z drugiego żądania http.
Podobne pytania
Nowe pytania
angular
Pytania o Angular (nie mylić z AngularJS), frameworku sieciowym od Google. Użyj tego tagu w przypadku pytań dotyczących Angulara, które nie są specyficzne dla pojedynczej wersji. W przypadku starszej platformy internetowej AngularJS (1.x) użyj tagu angularjs.