💬
useSWRでrefreshIntervalによるpollingを動的に止める
小ネタ。
API オプション – SWRによるとrefreshInterval
オプションに0より大きい値を設定するとsetInterval
のような定期的なポーリングリクエストを実装できる。
// 5秒おきにfetcherでリクエストを送る
const { data } = useSWR(key, fetcher, {refreshInterval: 5000})
このポーリングをfetcher
のレスポンスによって制御したい。例えばfetcher
のレスポンスに含まれるstatus
フィールドで判断したい場合は下記のようにやれば良い。
const [isProcessing, setIsProcessing] = useState(true)
const { data, error } = useSWR(key, fetcher, {
refreshInterval: isProcessing ? 5000 : 0,
onSuccess: ({ status }) = > {
setIsProcessing(status === 'processing')
}
)
return { data , loading: data && data.status === 'processing', error }
こうすることでstatus
がprocessing
の間はloading
をtrue
にできる。status
が処理済みになればloading
がfalse
になりrefreshInterval
も0になるのでポーリングが止まる。
手軽にpolling処理のハンドリングが出来て便利。
Discussion