web-dev-qa-db-ja.com

Angular 2:ObservableをPromiseに変換

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

ありがとう!

43
Dave

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

observableは、次のようにpromiseに変換できます。

let promise=observable.toPromise();
16
Luca C.

あなたは本当にこれを行う必要はありません...

import 'rxjs/add/operator/first';


this.esQueryService.getDocuments$.first().subscribe(() => {
        event.enableButtonsCallback();
      },
      (err: any) => console.error(err)
    );
    this.getDocuments(query, false);

first()は、サブスクライブブロックが一度だけ呼び出されることを保証します(その後は、サブスクライブしない場合と同じようになります)。promisesthen()とまったく同じです。

11
danday74

ObservableをPromiseにするための適切な方法は、次のとおりです。

getAssetTypesPromise() Observable<any> {
  return new Promise((resolve, reject) => {
      this.getAssetTypes().subscribe((response: any) => {
        resolve(response);
      }, reject);
    });
}
4
Teodor Hirs