Angular2 Observable
を使い始めましたが、Promises
で使用した.then
に似たものが見つかりません。
これが私が成し遂げたいことです。
public login() {
this._user = AuthService.getInstance().login(this._loginInfo);
}
return this._httpClient.post('LoginAction', credentials)
.map(res => res.json())
.subscribe(user => {
return new User(user);
});
Promiseを使用すると、login
関数はPromiseを返し、最終的にサーバーからの実際の応答に変換されます。しかし、Observableではこれは機能しません。
同様のことを行う方法はありますか? component
のlogin
関数内にサブスクライブを配置する必要を避けたい。稼働中のすべての作業を実行し、実際のオブジェクトをcomponent
に返したい。
また、Promise
でtoPromise
を作成しようとしましたが、toPromise is not a function
を取得し続けます。
追伸_httpClientは、angular2 httpのラッパーで、ヘッダーを追加するなどしてリクエストを準備します。
return this._httpClient.post('LoginAction', credentials)
.map(res => res.json())
.toPromise(). <-- i keep getting that it is not a function
then(user => {
return new User(user);
});
これを行うことで、私のコンポーネントはオブジェクト(必要なもの)を取得し、サービス中に追加のこと(ログに記録したユーザーをlocalstorageに保存するなど)を行うことができます。
そして、Promise
で同じことをしてもうまくいかない(または間違っている)ので、Observable
に切り替えましたか?
返されたオブジェクトは(toPromiseを呼び出す前に)Observableであることがわかりますが、実際にはtoPromise
関数が表示されません。
subscribe(...)
を呼び出すと、toPromise()
を持たないSubscription
が返されます。コードをsubscribe
からmap
に移動すると、subscribe
の代わりにtoPromise()
を使用できます
return this._httpClient.post('LoginAction', credentials)
.map(res => res.json())
.map(user => {
return new User(user);
}).toPromise();
呼び出し元はPromise
を取得します。
public login() {
this._user = AuthService.getInstance().login(this._loginInfo)
.then(result => {
doSomething();
});
}
しかし、 `.toPromise()を省略し、呼び出し元が次のように使用すると、同じ結果が得られます。
public login() {
this._user = AuthService.getInstance().login(this._loginInfo)
.subscribe(result => {
doSomething();
});
}
唯一の違いはsubscribe()
の代わりにthen()
であり、ライブラリのユーザーがリアクティブスタイルを好む場合は、彼が慣れているsubscribe()
を使用することを好みます。
Rx toPromise演算子をインポートする必要があります
import 'rxjs/add/operator/toPromise';
乾杯!
Angular2ドキュメントから
rxjs-extension.ts
に追加することをお勧めします
```
// Observable class extensions
import 'rxjs/add/observable/of';
import 'rxjs/add/observable/throw';
// Observable operators
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/debounceTime';
import 'rxjs/add/operator/distinctUntilChanged';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/filter';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/switchMap';
```
app.module.ts
(ルートモジュール)import './rxjs-extensions';
にインポートします
これにより、それ以上のエラーを防ぐことができます。