如何从 Promise 中 return Observable
How to return Observable from Promise
我需要 return 从 promise 中观察到,但是我在尝试学习时被语法所困扰 angular.So 事情是这样的:
我有一个函数 getCountries(这是由另一个实用程序订阅的),我需要调用它来检索国家/地区列表。'lang' 未定义 yet.I 添加它只是为了完成url 我的 api。
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 需要语言 (lang),并且此信息存储在存储中,可以按如下方式从存储中检索:
this.storage.get(AppSettings.STORAGE_KEYS.LANGUAGE_APP).then(language=>{
//here I can use language
});
现在我卡住的地方是如何在我从上述承诺中检索语言信息后调用我的 api。我需要确保函数 (getCountries) 仍然 return 是最初 returning 的可观察对象。
感谢您的帮助。
有些人建议将它们包裹在 Observable.fromPromise 中,我也这样做了,但是这破坏了 code.I 必须缺少一些东西我 know.Here 它 is:Did 它错过了return 一些东西,在代码之后发布我的堆栈跟踪:
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)
任何 Promise 都可以(轻松地)转换为 Observable:Observable.fromPromise()
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;
});
}
}
我需要 return 从 promise 中观察到,但是我在尝试学习时被语法所困扰 angular.So 事情是这样的:
我有一个函数 getCountries(这是由另一个实用程序订阅的),我需要调用它来检索国家/地区列表。'lang' 未定义 yet.I 添加它只是为了完成url 我的 api。
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 需要语言 (lang),并且此信息存储在存储中,可以按如下方式从存储中检索:
this.storage.get(AppSettings.STORAGE_KEYS.LANGUAGE_APP).then(language=>{
//here I can use language
});
现在我卡住的地方是如何在我从上述承诺中检索语言信息后调用我的 api。我需要确保函数 (getCountries) 仍然 return 是最初 returning 的可观察对象。 感谢您的帮助。
有些人建议将它们包裹在 Observable.fromPromise 中,我也这样做了,但是这破坏了 code.I 必须缺少一些东西我 know.Here 它 is:Did 它错过了return 一些东西,在代码之后发布我的堆栈跟踪:
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)
任何 Promise 都可以(轻松地)转换为 Observable:Observable.fromPromise()
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;
});
}
}