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!
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));
});
observable kann folgendermaßen in ein Versprechen umgewandelt werden:
let promise=observable.toPromise();
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 ()
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);
});
}