![](/img/trans.png)
[英]In Angular, how to return an Observable with result and errors from a promise
[英]How to return Observable from Promise
我需要從promise中返回Observable,但是當我嘗試學習angular時,我對語法感到困惑。
我有一個以下函數getCountries(該函數由另一個實用程序訂閱),在這里我需要調用以檢索國家列表.'lang'尚未定義,我補充說這只是為了完成我api的url。
getCountries(): Observable<Country[]> {
if (this.countries) {
return Observable.of(this.countries);
} else if (this.countriesObservable) {
return this.countriesObservable;
} else {
//lang is not defined yet it has to be retrieved from storage
this.countriesObservable = this.http.get(AppSettings.API_URL + '?locale=' + lang).map(json => {
delete this.countriesObservable; // when the cached countries is available we don't need reference anymore
this.countries = json as Country[];
this.countries = this.countries.sort(function (a, b) { return (a.Name > b.Name) ? 1 : ((b.Name > a.Name) ? -1 : 0); });
return this.countries;
}).share();
return this.countriesObservable;
}
}
由於api需要language(lang)並且此信息存儲在存儲中,可以按以下方式從存儲中檢索:
this.storage.get(AppSettings.STORAGE_KEYS.LANGUAGE_APP).then(language=>{
//here I can use language
});
現在,我受困的地方是在我從上述承諾中檢索語言信息后如何調用我的api。 我需要確保該函數(getCountries)仍然返回它最初返回的可觀察值。 謝謝你的幫助。
有人建議將它們包裝在Observable.fromPromise中,我也做了同樣的事情,但是這破壞了代碼。我肯定錯過了我所知道的東西。在這里是:它錯過了返回的東西,在代碼后發布了我的堆棧跟蹤信息:
getCountries(): Observable<Country[]> {
if (this.countries) {
return Observable.of(this.countries);
} else if (this.countriesObservable) {
return this.countriesObservable;
} else {
Observable.fromPromise(this.storage.get(AppSettings.STORAGE_KEYS.LANGUAGE_APP)).subscribe(language=>{
//here I can use language
this.countriesObservable = this.http.get(AppSettings.API_URL + '?locale=' + language).map(json => {
delete this.countriesObservable;
this.countries = json as Country[];
this.countries = this.countries.sort(function (a, b) { return (a.Name > b.Name) ? 1 : ((b.Name > a.Name) ? -1 : 0); });
return this.countries;
}).share();
return this.countriesObservable;
});
}
}
Error: Uncaught (in promise): TypeError: Cannot read property 'subscribe' of undefined
TypeError: Cannot read property 'subscribe' of undefined
at http://localhost:8100/build/main.js:71:33
at new t (http://localhost:8100/build/polyfills.js:3:20886)
at UtilsProvider.webpackJsonp.10.UtilsProvider.getCountryById (http://localhost:8100/build/main.js:70:16)
at MyApp.webpackJsonp.851.MyApp.updateUserInfo (http://localhost:8100/build/main.js:10067:47)
at http://localhost:8100/build/main.js:9774:23
at SafeSubscriber.schedulerFn [as _next] (http://localhost:8100/build/vendor.js:4004:36)
at SafeSubscriber.__tryOrUnsub (http://localhost:8100/build/vendor.js:16987:16)
at SafeSubscriber.next (http://localhost:8100/build/vendor.js:16934:22)
at Subscriber._next (http://localhost:8100/build/vendor.js:16874:26)
at Subscriber.next (http://localhost:8100/build/vendor.js:16838:18)
at c (http://localhost:8100/build/polyfills.js:3:19132)
at c (http://localhost:8100/build/polyfills.js:3:18841)
at http://localhost:8100/build/polyfills.js:3:19613
at t.invokeTask (http://localhost:8100/build/polyfills.js:3:15040)
at Object.onInvokeTask (http://localhost:8100/build/vendor.js:4238:33)
at t.invokeTask (http://localhost:8100/build/polyfills.js:3:14961)
at r.runTask (http://localhost:8100/build/polyfills.js:3:10214)
at o (http://localhost:8100/build/polyfills.js:3:7274)
at e.invokeTask [as invoke] (http://localhost:8100/build/polyfills.js:3:16203)
at p (http://localhost:8100/build/polyfills.js:2:26993)
可以通過: Observable.fromPromise()
將Promise(輕松)轉換為Observable。
Observable.fromPromise(this.storage.get(AppSettings.STORAGE_KEYS.LANGUAGE_APP))
.subscribe((language) => {
//here you can use language
});
只需使用Observable.fromPromise。 所以在你的情況下
getCountries(): Observable<Country[]> { if (this.countries) { return Observable.of(this.countries); } else if (this.countriesObservable) { return this.countriesObservable; } else { return Observable.fromPromise(this.storage.get(AppSettings.STORAGE_KEYS.LANGUAGE_APP)).mergeMap(language=>{ //here I can use language this.countriesObservable = this.http.get(AppSettings.API_URL + '?locale=' + language).map(json => { delete this.countriesObservable; // when the cached countries is available we don't need the reference anymore this.countries = json as Country[]; this.countries = this.countries.sort(function (a, b) { return (a.Name > b.Name) ? 1 : ((b.Name > a.Name) ? -1 : 0); }); return this.countries; }).share(); return this.countriesObservable; }); } }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.