Q).then(...)
?で呼び出すことができるように、次のオブザーバブルをプロミスに変換するにはどうすればよいですか?
私が約束に変換したい方法:
this._APIService.getAssetTypes().subscribe(
assettypes => {
this._LocalStorageService.setAssetTypes(assettypes);
},
err => {
this._LogService.error(JSON.stringify(err))
},
() => {}
);
呼び出すサービスメソッド:
getAssetTypes() {
var method = "assettype";
var url = this.apiBaseUrl + method;
return this._http.get(url, {})
.map(res => <AssetType[]>res.json())
.map((assettypes) => {
assettypes.forEach((assettypes) => {
// do anything here you might need....
});
return assettypes;
});
}
ありがとう!
rxjs6
https://github.com/ReactiveX/rxjs/issues/2868#issuecomment-360633707
パイプしないでください。デフォルトではObservableオブジェクト上にあります。
Observable.of('foo').toPromise(); // this
rxjs5
import 'rxjs/add/operator/toPromise';
import 'rxjs/add/operator/map';
...
this._APIService.getAssetTypes()
.map(assettypes => {
this._LocalStorageService.setAssetTypes(assettypes);
})
.toPromise()
.catch(err => {
this._LogService.error(JSON.stringify(err));
});
observableは、次のようにpromiseに変換できます。
let promise=observable.toPromise();
あなたは本当にこれを行う必要はありません...
import 'rxjs/add/operator/first';
this.esQueryService.getDocuments$.first().subscribe(() => {
event.enableButtonsCallback();
},
(err: any) => console.error(err)
);
this.getDocuments(query, false);
first()は、サブスクライブブロックが一度だけ呼び出されることを保証します(その後は、サブスクライブしない場合と同じようになります)。promisesthen()とまったく同じです。
ObservableをPromiseにするための適切な方法は、次のとおりです。
getAssetTypesPromise() Observable<any> {
return new Promise((resolve, reject) => {
this.getAssetTypes().subscribe((response: any) => {
resolve(response);
}, reject);
});
}