2017-04-24 4 views
3

Ich habe eine Angular2 (ionic2) -Anwendung. Ich habe eine Funktion, die Städte anfordert, aber ich bekomme einen Fehler, dass die Eigenschaft subscribe nicht auf this.cityService.getAllCities() existiert.Versprechen und abonnieren

cityPage.ts hat eine Funktion wie folgt aus:

getCities(){ 
    this.cityService.getAllCities() 
      .subscribe(cityData => { this.cityList = cityData; }, 
      err => console.log(err), 
      () => console.log('Complete!') 
    ); 
} 

meine cityService.getAllCities() Funktion wie folgt aussieht:

getAllCities(){ 

    return new Promise (resolve => { 
     this.storage.ready().then(() => { 

      this.storage.get('authData').then(authData => { 
       let hdr = new Headers({'Content-Type': 'application/json', 'Authorization': 'Bearer ' + 
       authData.access_token }); 
       let opt = new RequestOptions({ headers: hdr }); 
       return this.http.get(AppSettings.API_GET_CITIES).map(res => <CityModel[]> res.json(), opt); 
      }).catch(() => { 
       //resolve(false); 
      }); 

     }); 

    }); 

    } 

bearbeiten

Basierend auf den Kommentar, den ich habe meine Funktion so geändert:

getAllCities(){ 

    return Observable.create(resolve => { 
     this.storage.ready().then(() => { 

      this.storage.get('authData').then(authData => { 
       let hdr = new Headers({'Content-Type': 'application/json', 'Authorization': 'Bearer ' + 
       authData.access_token }); 

       console.log('access_token ' + authData.access_token); 
       let opt = new RequestOptions({ headers: hdr }); 
       return this.http.get(AppSettings.API_GET_CITIES,opt).map(res => <CityModel[]> res.json()).subscribe((result) => { 
        console.log(result); 
        resolve = result; 
       }); 
      }).catch(() => { 
       //resolve(false); 
      }); 

     }); 

    }); 

    } 

In meinem console.log(result) erhalte ich Daten, aber die Daten werden nie an meine getCities() Funktion zurückgegeben. Auch die console.log('Complete!') wird nicht aufgerufen.

+0

Promise.Then ... Verwenden Observer abonnieren – birwin

Antwort

4

Der Grund, warum es einen Fehler wirft, weil .subscribe Methode verfügbar ist auf Observable zu hören, wann immer es eine Daten abgibt. Hier von getAllCities Methode sind Rückkehr Sie eine promise Sie .then Funktion anwenden könnten über sie Daten von diesem zurück bekommen Promise

getCities() { 
    this.cityService.getAllCities() 
    .then(
     cityData => { this.cityList = cityData; }, 
     err => console.log(err), 
     () => console.log('Complete!') 
); 
} 

Und auch Versprechen von getAllCities Methode zurückkehren, indem .toPromise() Verfahren über http.get() beobachtbare aufrufen.

getAllCities(){ 

    return new Promise (resolve => { 
     this.storage.ready().then(() => { 

      this.storage.get('authData').then(authData => { 
       let hdr = new Headers({'Content-Type': 'application/json', 'Authorization': 'Bearer ' + 
       authData.access_token }); 
       let opt = new RequestOptions({ headers: hdr }); 
       //returned promise from here. 
       return this.http.get(AppSettings.API_GET_CITIES) 
        .map(res => <CityModel[]> res.json(), opt) 
        .toPromise(); 
      }).catch(() => { 
       //resolve(false); 
      }); 
     }); 
    }); 
} 
+0

Die oben gab mir die Lösung, obwohl ich einige der Code ändern musste. Anstelle von 'return this.http.get' musste ich' resolve (this.http.get) ' – kwv84

+0

@ kwv84' return this.http.get (AppSettings.API_GET_CITIES) .map (res => res.json(), opt) .toPromise() 'sollte auch den Trick –

+0

@PankajParkar gleiche Sache für mich tun, müssen Entschlossenheit hinzufügen (this.http.get) ... und ich olso behalten die.' toPromise() ' –

Verwandte Themen