94 votes

Angular 2: convertir l'observable en promesse

Q) Comment puis-je convertir l'observable suivant en 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'elle 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!

142voto

Günter Zöchbauer Points 21340

rxjs6

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

Ne pipe pas. 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));
});
 

23voto

Luke Points 82

observable peut être converti en promesse comme ceci:

 let promise=observable.toPromise();
 

13voto

danday74 Points 15895

vous n'avez pas vraiment besoin de faire ça juste faire ...

 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 ne vous êtes jamais abonné), exactement comme promis alors ()

13voto

Teodor Hirs Points 17

La bonne façon de faire d'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);
    });
} 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X