Невозможно прочитать свойство «подписка» неопределенной ошибки TypeError - PullRequest
0 голосов
/ 24 апреля 2018

Я работаю над приложением Ionic, и у меня есть следующий метод, который вызывает наблюдаемое:

  getCountryById(id: number): Promise<Country> {
    return new Promise((resolve, reject) => {
      this.getCountries().subscribe(countries => {
        for (let country of countries) {
          if (country.Id == id) {
            resolve(country);
          }
        }
        resolve(undefined);
      }, err => reject(err));
    })
  }

Другой метод:

  getCountries(): Observable<Country[]> {
    if (this.countries) {
      return Observable.of(this.countries);
    } else if (this.countriesObservable) {
      return this.countriesObservable;
    } else {

      this.storage.get(AppSettings.STORAGE_KEYS.LANGUAGE_APP).then(
        language=>{
          this.countriesObservable = 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;
          }).share();
        }
      ).catch(err=>{
      });

      return this.countriesObservable;

    }

  }

Я почти уверен, что возвращаю неверные данные. Как мне реорганизовать второй метод, чтобы он возвращал действительные значения Observable, чтобы первый метод мог работать с этим. Я все еще пытаюсь обернуть голову в Promise и Observable. Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 24 апреля 2018

Ваша проблема в том, что, когда 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;

Возможно, вам придется внести несколько корректировок, но это идея.Надеюсь, это вам подойдет.

...