Если элемент localStorage имеет значение null, установить элемент, в противном случае вернуть элемент в Observable? - PullRequest
0 голосов
/ 11 января 2019

Я работаю над приложением Angular 6, в котором я хочу хранить часто используемые, но редко изменяемые массивы объектов в localStorage. У меня есть класс обслуживания, который используется для получения этих массивов из веб-службы. Функции в сервисе возвращают наблюдаемые. Я хочу проверить localStorage, чтобы увидеть, если массив уже там. Если это не так, то я хочу получить массив из веб-службы и установить для элемента localStorage возвращаемое значение. Если он уже есть, просто верните то, что хранится. Я борюсь с тем, как вернуть наблюдаемую из всех возможных ветвей этого условного. Похоже на то, что кто-то уже сделал, но я не могу найти примеры этого ...

Вот моя существующая функция для возврата одного из этих массивов:

getApprovalRoutes(): Observable < ApprovalRoute[] > {
  if (!localStorage.getItem("allRoutes")) {
    this.http.get < ApprovalRoute[] > (`${this.baseUrl}/Routes`).subscribe(ar => {
      localStorage.setItem("allRoutes", JSON.stringify(ar));
      return Observable.from(ar);
    });
  } else {
    return Observable.from(JSON.parse(localStorage.getItem("allRoutes")));
  }
}

Когда я запускаю это, я получаю следующую ошибку:

Невозможно прочитать свойство 'подписка' из неопределенного

Спасибо за помощь!

1 Ответ

0 голосов
/ 11 января 2019
this.http.get < ApprovalRoute[] > (`${this.baseUrl}/Routes`).subscribe(ar => {
  localStorage.setItem("allRoutes", JSON.stringify(ar));
  return Observable.from(ar);
});

Вышесказанное не возвращает наблюдаемого. Вы не можете вернуть значение в подписчике вызывающей функции.

return Observable.from(JSON.parse(localStorage.getItem("allRoutes")));

Выше используется from(), который преобразует массив значений в индивидуально выданные значения. Это не соответствует типу возврата Observable<ApprovalRoute[]>, который генерирует массив.

На основании того, что я вижу в вашем примере. Я думаю, может быть, это то, что вы пытались.

getApprovalRoutes(): Observable<ApprovalRoute[]> {
    return of(localStorage.getItem('allRoutes'))
        .pipe(
            switchMap(routes => {
                if (!routes) {
                    return this.http.get<ApprovalRoute[]>(`${this.baseUrl}/Routes`)
                        .pipe(tap(ar => localStorage.setItem('allRoutes', JSON.stringify(ar))));
                }
                return of(JSON.parse(routes));
            })
        );
}

Вы хотите передать значения из localStorage, а если значение пустое, переключиться на HTTP-запрос. Откройте результаты HTTP и поместите их в хранилище.

...