wake-up-neo.com

Angular 2: Observable in Promise konvertieren

Q) Wie konvertiere ich die folgende Observable in ein Versprechen, damit ich sie mit .then(...) aufrufen kann?

Meine Methode, die ich in ein Versprechen umwandeln möchte:

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

Die aufgerufene Dienstmethode:

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

Vielen Dank!

43
Dave

rxjs6

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

Pfeife nicht. Es befindet sich standardmäßig auf dem Observable-Objekt.

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 kann folgendermaßen in ein Versprechen umgewandelt werden:

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

sie brauchen das nicht wirklich zu tun, tun Sie einfach ...

import 'rxjs/add/operator/first';


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

first () stellt sicher, dass der subscribe-Block nur einmal aufgerufen wird (danach wird es so sein, als ob Sie nie abonniert hätten), genau wie ein Versprechen then ()

11
danday74

Der richtige Weg, Observable zu einem Versprechen zu machen, ist in Ihrem Fall der folgende

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