cacheSignal
cacheSignal์ ์ฌ์ฉํ๋ฉด cache() ์๋ช
์ด ์ธ์ ๋๋๋์ง ์ ์ ์์ต๋๋ค.
const signal = cacheSignal();๋ ํผ๋ฐ์ค
cacheSignal
cacheSignal์ ํธ์ถํ๋ฉด AbortSignal์ ์ป์ ์ ์์ต๋๋ค.
import {cacheSignal} from 'react';
async function Component() {
await fetch(url, { signal: cacheSignal() });
}React๊ฐ ๋ ๋๋ง์ ์๋ฃํ๋ฉด AbortSignal์ด ์ค๋จ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ ์ด์ ํ์ํ์ง ์์ ์งํ ์ค์ธ ์์
์ ์ทจ์ํ ์ ์์ต๋๋ค.
๋ ๋๋ง์ด ์๋ฃ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ ๊ฒฝ์ฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- React๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋ ๋๋ง์ ์๋ฃํ ๊ฒฝ์ฐ
- ๋ ๋๋ง์ด ์ค๋จ๋ ๊ฒฝ์ฐ
- ๋ ๋๋ง์ด ์คํจํ ๊ฒฝ์ฐ
๋งค๊ฐ๋ณ์
์ด ํจ์๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ง ์์ต๋๋ค.
๋ฐํ๊ฐ
cacheSignal์ ๋ ๋๋ง ์ค์ ํธ์ถ๋๋ฉด AbortSignal์ ๋ฐํํฉ๋๋ค. ๊ทธ ์ธ์ ๊ฒฝ์ฐ์ cacheSignal()์ null์ ๋ฐํํฉ๋๋ค.
์ฃผ์ ์ฌํญ
cacheSignal์ ํ์ฌ React ์๋ฒ ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์์๋ ํญ์null์ ๋ฐํํฉ๋๋ค. ํฅํ ํด๋ผ์ด์ธํธ ์บ์๊ฐ ๊ฐฑ์ ๋๊ฑฐ๋ ๋ฌดํจํ๋ ๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์์๋ ์ฌ์ฉ๋ ์์ ์ ๋๋ค. ํด๋ผ์ด์ธํธ์์ ํญ์null์ ๋ฐํํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ์ ๋ฉ๋๋ค.- ๋ ๋๋ง ์ธ๋ถ์์ ํธ์ถํ๋ฉด
cacheSignal์null์ ๋ฐํํ์ฌ ํ์ฌ ์ค์ฝํ๊ฐ ์์ํ ์บ์๋์ง ์์์ ๋ช ํํ ํฉ๋๋ค.
์ฌ์ฉ๋ฒ
์งํ ์ค์ธ ์์ฒญ ์ทจ์ํ๊ธฐ
cacheSignal์ ํธ์ถํ์ฌ ์งํ ์ค์ธ ์์ฒญ์ ์ค๋จํ ์ ์์ต๋๋ค.
import {cache, cacheSignal} from 'react';
const dedupedFetch = cache(fetch);
async function Component() {
await dedupedFetch(url, { signal: cacheSignal() });
}React๊ฐ ๋ ๋๋ง์ ์๋ฃํ ํ ์ค๋ฅ ๋ฌด์ํ๊ธฐ
ํจ์๊ฐ ์ค๋ฅ๋ฅผ ๋์ง๋ ๊ฒฝ์ฐ ์ทจ์๋ก ์ธํ ๊ฒ์ผ ์ ์์ต๋๋ค. (์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด ๋ซํ ๊ฒฝ์ฐ) aborted ์์ฑ์ ์ฌ์ฉํ์ฌ ์ค๋ฅ๊ฐ ์ทจ์๋ก ์ธํ ๊ฒ์ธ์ง ์ค์ ์ค๋ฅ์ธ์ง ํ์ธํ ์ ์์ต๋๋ค. ์ทจ์๋ก ์ธํ ์ค๋ฅ๋ ๋ฌด์ํ ์ ์์ต๋๋ค.
import {cacheSignal} from "react";
import {queryDatabase, logError} from "./database";
async function getData(id) {
try {
return await queryDatabase(id);
} catch (x) {
if (!cacheSignal()?.aborted) {
// only log if it's a real error and not due to cancellation
logError(x);
}
return null;
}
}
async function Component({id}) {
const data = await getData(id);
if (data === null) {
return <div>No data available</div>;
}
return <div>{data.name}</div>;
}