Ваша проблема в том, что, когда this.countriesObservable
равно undefined
, вы звоните this.storage.get(...).then(...)
.Внутри обратного вызова для обещания вы устанавливаете this.countriesObservable
.
Проблема в том, что при достижении return this.countriesObservable
обратный вызов на then
не был выполнен, и поэтому вы все еще возвращаетеundefined
.
Вы должны присвоить this.countriesObservable
новому Observable
перед вызовом this.storage.get
(возможно, Subject
), затем, внутри then
, вы просто слушаете наблюдаемое вамисобирались вернуться, и внутри его вызова к subscribe
, передать this.countriesObservable
с данными, которые вы хотите:
const _subject = new Subject<Country[]>();
this.countriesObservable = _subject;
this.storage.get(AppSettings.STORAGE_KEYS.LANGUAGE_APP).then(
language=>{
this.http.get(AppSettings.API_URL + 'api/Countries?locale=' + language).map(json => {
delete this.countriesObservable; // when the cached countries is available we don't need the `countriesObservable` 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;
}).subscribe(countries => _subject.next(countries));
}
).catch(err=>{});
return this.countriesObservable;
Возможно, вам придется внести несколько корректировок, но это идея.Надеюсь, это вам подойдет.