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
OPV 31 październik 2018, 02:16

1 odpowiedź

Najlepsza 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.

1
Woot 31 październik 2018, 20:03