web-dev-qa-db-fra.com

Angular 2: Convertissez Observable en promesse

Q) Comment convertir l'observable suivant en une promesse afin de pouvoir l'appeler avec .then(...)?

Ma méthode que je veux convertir en promesse:

  this._APIService.getAssetTypes().subscribe(
    assettypes => {
        this._LocalStorageService.setAssetTypes(assettypes);
    },
    err => {
        this._LogService.error(JSON.stringify(err))
    },
    () => {}
  ); 

La méthode de service qu'il appelle:

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

Merci!

43
Dave

rxjs6

https://github.com/ReactiveX/rxjs/issues/2868#issuecomment-360633707

Ne pas pipe. C'est sur l'objet Observable par défaut.

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
Günter Zöchbauer

observable peut être converti en promesse comme ceci:

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

vous n'avez pas vraiment besoin de faire cela, faites-le ...

import 'rxjs/add/operator/first';


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

first () garantit que le bloc subscribe n'est appelé qu'une seule fois (après quoi, ce sera comme si vous n'aviez jamais souscrit), exactement comme une promesse then ()

11
danday74

La bonne façon de faire observable une promesse, dans votre cas, serait de suivre

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