2016-05-10 3 views
1

Ich habe das folgende Verfahren unter Verwendung von ionischen 2 mit kantigen 2:beobachtbare nicht während Angular 2 HTTP-Anfrage Brennen

private login(params: any, url: string){ 
    var p = new Promise<JsonResult>((resolve, reject) => { 
     let body = JSON.stringify(params); 
     let headers = new Headers({ 'Content-Type': 'application/json' }); 
     let options = new RequestOptions({ headers: headers }); 
     this.http.post(url, body, options) 
      .timeout(10000, new Error('Timeout exceeded during login')) 
      .subscribe((res) => { 
       let json = new JsonResult().deserialize(res.json()); 
       resolve(json); 
      }, (err) => { 
       reject(err); 
      }); 
    }); 
    return p; 
} 

Egal was ich tue, ist die Zeichnung nicht wie erwartet funktioniert. Der Fehlerhandler wird nie ausgelöst. Nicht einmal nach Ablauf der Zeitüberschreitung.

Ist das ein bekanntes Problem, oder stimmt etwas mit meiner Syntax nicht?

Jede Hilfe wäre willkommen.

+0

Für diejenigen fragen, verwende ich den folgenden Import: Import {Http, Headers, RequestOptions, Response HTTP_PROVIDERS} von ' angular2/http '; und injizieren Sie es in meine Klasse innerhalb des Konstruktors –

+1

Bitte bearbeiten Sie Ihre Frage und fügen Sie dort zusätzliche Informationen hinzu. Code ist umständlich in Kommentaren zu lesen. –

+0

Was importieren Sie in Bezug auf Rxjs? –

Antwort

1

Wenn Sie ein Promise zurückkehren ich es auf diese Weise tun würde:

private login(params: any, url: string){ 
     let body = JSON.stringify(params); 
     let headers = new Headers({ 'Content-Type': 'application/json' }); 
     let options = new RequestOptions({ headers: headers }); 
     return this.http.post(url, body, options) 
      .timeout(10000, new Error('Timeout exceeded during login')) 
      .catch(err => { 
       console.log(err); 
       return Observable.of([])); 
      }) 
      .map((res) => { 
       return new JsonResult().deserialize(res.json()); 
      }) 
      .toPromise(); 
} 
+0

Wird dies nicht nur die Zeitüberschreitung erfassen? Ich denke auch nicht, dass die Map-Funktion für mich ausreichend ist, da ich viele andere (asynchrone) Aufgaben im Erfolgs-Handler mache, wie das Speichern des zurückgegebenen J-Servers in der Datenbank. Ich verstehe, http wird ein Versprechen zurückgeben, aber sollte es nicht möglich sein Versprechen zu verschachteln? –

+0

Sicher ist es möglich, aber es scheint ein bisschen umständlich. Es gibt Operatoren (wie FlatMap), die auf asynchrone Aufrufe warten. Ich denke Code wird den Rx-Weg viel lesbarer sein als das Mischen von Observablen und Versprechen. –

+1

Ich habe mit einer kleinen Variation an deinem Code gearbeitet! Danke für den Beitrag zur Verwendung von Versprechungen anstelle von Observablen ... hat mir sehr geholfen! –