Angular кеш http в локальном хранилище - PullRequest
0 голосов
/ 13 января 2020

В проекте Ioni c 4 Angular 8 я пытаюсь получить информацию в хранилище перед вызовом API.

Вот мой код

public getData(id) {
    return this.storage.get(id).then(
        content => {
            if (content == null) {
                return this.getObject(id).subscribe(
                    result => {
                        return result;
                    }
                );
            } else {
                return content;
            }
        }
    );
}

Как мне вызвать function 'getData?

myService.getData(id).then

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

Ответы [ 2 ]

2 голосов
/ 13 января 2020

Если вы используете Rx JS 6, я бы порекомендовал вам преобразовать обещание в наблюдаемое (используя оператор из ), а затем обрабатывать последующие операции с использованием конвейерных операторов, таких как tap или switchMap, в зависимости от желаемого поведения вашего метода. В этом случае мы можем использовать switchMap , так как мы возвращаем наблюдаемое.

import { from } from 'rxjs';
import { switchMap } from 'rxjs/operators';

getData(id) {
  return from(this.storage.get(id))
    .pipe(
      switchMap(content => {
        if (content === null) {
          return this.getObject(id);
        } else {
          return of(content);
        }
      }),
    )
}

Оттуда вы можете подписаться на getData и вернуть наблюдаемые.

myService.getData(id).subscribe((res) => {
  // do the rest here
})
0 голосов
/ 13 января 2020

Вы ищете что-то вроде этого?

public getData(id): Observable<any> {
  return this.storage.get(id)
    .then(content => {
      if (content === null) {
        return this.getObject(id);
      } else {
        return of(content);
      }
    }
}

Тогда вы сможете назвать это как:

myService.getData(id).subscribe(console.log);

ОБНОВЛЕНИЕ

Не могли бы вы попробовать это?

getData(id): Observable<any> {
  return Observable.fromPromise(this.storage.get(id)).switchMap(content => {
    if (content === null) {
      return this.getObject(id);
    } else {
      return of(content);
    }
  })
}
...