Rxjs로 쉬운 캐싱
오늘은 Rxjs를 사용하여 원하는 위치(로컬 스토리지, 메모리, 쿠키 등)에 API 응답을 캐싱하는 가장 쉽고 쉬운 방법을 설명하겠습니다.
이 방법은 React, Vue, Angular 또는 기타 프레임워크에서 작동합니다.
1- API 서비스 생성
API 서비스는 모든 API 호출을 포함할 수 있는 좋은 방법입니다(Angular를 사용하는 경우 이미 갖고 있는 것 같습니다).
Angular에서는
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Injectable({
providedIn: 'root',
})
export class TaskService {
constructor(private http: HttpClient) {}
all_tasks():Observable<any>
{
return this.http.get<any>('example.com/api/tasks');
}
}
다른 프레임워크의 경우
아직 설치하지 않은 경우 다음 라이브러리를 설치해야 합니다.
$ npm install axios rxjs axios-observable
이와 같이 API 서비스를 만듭니다.
참고: 이해가 되지 않으면 chech할 수 있습니다.
import Axios, { AxiosObservable } from "axios-observable";
class TaskService {
private static _instance: TaskService;
public static get Instance() {
return this._instance || (this._instance = new this());
}
all_tasks(): AxiosObservable<any> {
return Axios.get<any>('example.com/api/tasks');
}
}
export const _TaskService=TaskService.Instance;
2- 캐싱 수행
캐싱을 위해 선택할 수 있는 옵션이 많이 있습니다. 처음에는
Localstorage
를 선택한 다음 memory
에 저장하는 방법을 보여 드리겠습니다.1-다음 연산자 가져오기
filter
, startWith
, tap
rxjs/operators
에서 .2-
pipe()
를 사용하여 API 호출에 추가합니다.각도의 경우
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { filter, startWith, tap } from "rxjs/operators";
@Injectable({
providedIn: 'root',
})
export class TaskService {
constructor(private http: HttpClient) {}
all_tasks():Observable<any>
{
return this.http.get<any>('example.com/api/tasks')
.pipe(
tap(res => localStorage['chash_key'] = JSON.stringify(res)),
startWith(JSON.parse(localStorage['chash_key'] || '{}')),
filter(res=>Object.keys(res).length !== 0),
);
}
}
다른 프레임워크의 경우
import Axios, { AxiosObservable } from "axios-observable";
import { filter, startWith, tap } from "rxjs/operators";
class TaskService {
private static _instance: TaskService;
public static get Instance() {
return this._instance || (this._instance = new this());
}
all_tasks(): AxiosObservable<any> {
return Axios.get<any>('example.com/api/tasks')
.pipe(
tap(res => localStorage['chash_key'] = JSON.stringify(res)),
startWith(JSON.parse(localStorage['chash_key'] || '{}')),
filter(res=>Object.keys(res).length !== 0),
);
}
}
export const _TaskService=TaskService.Instance;
축하합니다. 그게 다야🥳🥳🥳...
설명
여기서는 세 가지 연산자를 사용합니다.
로깅과 같은 조치나 부작용을 투명하게 수행하고자 할 때 사용합니다.
소스에서 방출하기 전에 값을 방출하려는 경우에 사용됩니다.
소스에서 방출을 필터링하려는 경우에 사용됩니다.
왜 우리는 그것들을 사용합니까?
tap
를 사용하여 성공적인 API 응답을 Localstorage
에 저장합니다.방출이 소스에서 도착하기 전에 캐시된 값을 방출하기 위해
startWith
를 사용하고 캐시 저장소가 비어 있는 경우 빈 개체를 방출하기 위해 localStorage['chash_key'] || '{}'
를 추가합니다.filter
를 사용하여 최종 방출을 필터링하므로 캐시 저장소가 비어 있고 startWith
연산자가 빈 개체를 반환하는 경우 filter
가 이를 차단합니다.filter
를 추가하지 않으면 프런트 엔드에 버그가 생길 수 있습니다.참고: 그런데
[]
와 같은 API에서 원시 배열을 가져오는 경우 startWith(JSON.parse(localStorage['chash_key'] || '[]'))
를 수행하고 filter
연산자를 삭제할 수 있습니다.원한다면 여기서 멈출 수 있습니다. 이제 메모리에 캐시하는 방법을 설명하겠습니다.
메모리에 캐시하려면 몇 가지만 변경하면 됩니다.
1- 클래스에서 개인 var 유형
any
선언2-
tap
연산자를 사용하여 해당 var에 API res를 저장합니다.귀하의 코드는
각도의 경우
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { filter, startWith, tap } from "rxjs/operators";
@Injectable({
providedIn: 'root',
})
export class TaskService {
constructor(private http: HttpClient) {}
private TasksCache: any;
all_tasks():Observable<any>
{
return this.http.get<any>('example.com/api/tasks')
.pipe(
tap(res => this.TasksCache = JSON.stringify(res)),
startWith(JSON.parse(this.TasksCache || '{}')),
filter(res=>Object.keys(res).length !== 0),
);
}
}
다른 프레임워크의 경우
import Axios, { AxiosObservable } from "axios-observable";
import { filter, startWith, tap } from "rxjs/operators";
class TaskService {
private static _instance: TaskService;
private TasksCache: any;
public static get Instance() {
return this._instance || (this._instance = new this());
}
all_tasks(): AxiosObservable<any> {
return Axios.get<any>('example.com/api/tasks')
.pipe(
tap(res => this.TasksCache = JSON.stringify(res)),
startWith(JSON.parse(this.TasksCache || '{}')),
filter(res=>Object.keys(res).length !== 0),
);
}
}
export const _TaskService=TaskService.Instance;
끝...
이제 처음으로 데이터를 가져오려고 하면 성공적인 응답이 캐시되어 다음 가져오기에 사용됩니다.
유용한 링크 🔗
https://rxjs.dev/api/operators/tap
https://rxjs.dev/api/operators/filter
https://rxjs.dev/api/operators/startWith
자오시양 / 축 관찰 가능
rxjs 방식으로 축을 사용합니다. Promise 대신 Observable 사용
축 관찰 가능
브라우저 및 node.js용 Observable(Promise와 반대) 기반 HTTP 클라이언트
rxjs(observable) 방식으로 axios를 사용하고 싶습니까? 우리는 거기에 갈!
axios-observable의 이 API는 axios의 API와 거의 동일하여 원활한 전환을 제공합니다. 따라서 문서는 axios 중 하나를 반영합니다(몇 가지 예외는 지적될 것입니다).
특징
설치 중
npm 사용
참고:
axios
및 rxjs
는 피어 종속성입니다.$ npm install axios rxjs axios-observable
예시
GET
요청 수행import Axios from 'axios-observable'; // or const Axios = require('axios-observable').Axios; // Make a request for a user with a given ID Axios.get('/user?ID=12345') .…
View on GitHub
.
Reference
이 문제에 관하여(Rxjs로 쉬운 캐싱), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/chrollo4ki/easy-caching-with-rxjs-jkl텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)