2016-05-10 56 views
1

中に発火ない私は、角2とイオン2を使用して、次のメソッドを持っていない:予想通り観察可能な角度2 HTTPリクエスト

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; 
} 

どんなに私は何をすべきか、サブスクライブが動作していません。 エラーハンドラは決して起動しません。タイムアウトを超えた後でさえも。

これは既知の問題ですか、または構文に問題がありますか?

ご協力いただければ幸いです。

+0

を角度2/http '; コンストラクタ内のクラスに挿入してください –

+1

質問を編集し、そこに追加情報を追加してください。コードはコメントで読むのが面倒です。 –

+0

rxjsに関して何をインポートしますか? –

答えて

1

あなたがPromiseを返すようにしたい場合は、私はそれをこのようにするだろう。」から インポート{HTTP、ヘッダ、RequestOptions、レスポンス、HTTP_PROVIDERS}:これらの疑問に、私は以下のインポートを使用するために

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

これはタイムアウトを捕捉するだけではありませんか? 返されたjsonをデータベースに格納するなど、成功ハンドラ内で他に多くの(非同期の)タスクを実行するので、マップ関数が十分であるとは思えません。私はhttpが約束を返すと理解していますが、約束を入れ子にすることはできませんか? –

+0

確かに可能ですが、ちょっと面倒です。非同期呼び出しを待つ演算子(flatMapなど)があります。私は、オブザーバブルと約束を混合するよりも、コードがRxの方がはるかに読みやすくなると思います。 –

+1

私はあなたのコードの小さなバリエーションで作業している! observablesの代わりに約束を使ってくれてありがとう...多くの助けになった! –

関連する問題