redux-saga method(delay, call, put, fork, all, takeEvery, takeLatest)

# ์‹œ์ž‘

Nextjs๋กœ Redux๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ Redux-saga๋ฅผ ์ฒ˜์Œ ์ ์šฉํ•ด๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค. yield์™€ Generator๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ต์ˆ™ํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ Redux-saga์™€ ๊ด€๋ จ๋œ ์ž๋ฃŒ๋“ค์„ ์ฐพ์•„ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋‹ˆ function*์˜ ํ‚ค์›Œ๋“œ๋กœ ์‹œ์ž‘ํ•˜๋Š” saga ํ•จ์ˆ˜๋“ค์„ ์ž‘๋™์‹œํ‚ค๋Š” ์›๋ฆฌ์™€ ์ด ํ•จ์ˆ˜๋ฅผ ๋ณด์กฐํ•˜๋Š” watch- ํ•จ์ˆ˜๋“ค์— ์‚ฌ์šฉ๋˜๋Š” delay, call, takeEvery ๋“ฑ์˜ ํ•จ์ˆ˜๋“ค์ด ์ •ํ™•ํžˆ ์ดํ•ด๋˜์ง€ ์•Š์•˜๋‹ค.

ํŠนํžˆ watch- ํ•จ์ˆ˜๊ฐ€ ์™œ ํ•„์š”ํ•œ์ง€ ์—ฌ๊ธฐ์— ์“ฐ์ด๋Š” takeEvery์™€ takeLatest๊ฐ€ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€๊ฐ€ ์ œ์ผ ํ—ท๊ฐˆ๋ ธ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ๋ฆฌ๋•์Šค ์‚ฌ๊ฐ€์˜ ํ•จ์ˆ˜๋“ค์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค.

takeEvery์™€ takeLatest๋ฅผ ํ‚ค์›Œ๋“œ๋กœ ๊ฒ€์ƒ‰ํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ์ดํ•ด๊ฐ€ ์ž˜ ๋˜๊ฒŒ ์ •๋ฆฌ๋˜์–ด ์žˆ์–ด์„œ ์•„๋ž˜ ๋ธ”๋กœ๊ทธ์—์„œ ์ฐธ๊ณ ํ•˜๋ฉด์„œ ์ •๋ฆฌํ•˜์˜€๋‹ค.

https://sustainable-dev.tistory.com/94

# Redux-saga์˜ ์ฃผ์š” ํ•จ์ˆ˜

delay

์„ค์ •๋œ ์‹œ๊ฐ„ ์ดํ›„์— resolveํ•˜๋Š” Promise ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

ex.

notion image

delay(1000); // 1์ดˆ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ

put

ํŠน์ • ์•ก์…˜์„ dispatchํ•˜๋„๋ก ํ•œ๋‹ค.

ex.

notion image

put( { type : "INCREMENT" } ); // INCREMENT action์„ dispatch ํ•œ๋‹ค.

takeEvery

๋“ค์–ด์˜ค๋Š”ย ๋ชจ๋“  ์•ก์…˜์— ๋Œ€ํ•ด ํŠน์ • ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ด ์ค€๋‹ค.

ex.

notion image

takeEvery("INCREMENT_ASYNC", incrementAsync); // ๋“ค์–ด์˜ค๋Š”ย ๋ชจ๋“ ย INCREMENT_ASYNC ์•ก์…˜์— ๋Œ€ํ•ด increaseSaga ํ•จ์ˆ˜ ์‹คํ–‰

ย 
ย 

+ ๋ชจ๋“  ์•ก์…˜์„ ์œ ํšจํ•˜๊ฒŒ ์ธ์ •, while(true)๋กœ ๊ฐ์‹ธ๋Š” ํšจ๊ณผ, ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ LOG_IN_REQUEST ์š”์ฒญ์„ ๋ฐ›๊ณ  LOG_IN_SUCCESS๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์—์„œ takeEvery๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ์š”์ฒญ๋งŒ ๋ฐ›๊ณ  ์‹คํ–‰๋˜์–ด์•ผ ํ• (put๋˜์–ด์•ผ ํ• ) ๋™์ž‘์ด ์ดํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

ex.

notion image

takeLatest

๊ธฐ์กด์— ์ง„ํ–‰ ์ค‘์ด๋˜ ์ž‘์—…์ด ์žˆ๋‹ค๋ฉด ์ทจ์†Œ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹คํ–‰๋œ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค.

ex.

notion image

takeLatest(REGISTER, registerSaga); // REGISTER ์•ก์…˜์— ๋Œ€ํ•ด์„œ ๊ธฐ์กด์— ์ง„ํ–‰์ค‘์ด๋˜ ์ž‘์—…์ด ์žˆ๋‹ค๋ฉด ์ทจ์†Œ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹คํ–‰๋œ ์ž‘์—…์— ๋Œ€ํ•ด์„œ๋งŒ registerSagaํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. (์‹ค์ˆ˜๋กœ ๋กœ๊ทธ์ธ์ด๋‚˜ ํšŒ์›๊ฐ€์ž… ๋ฒ„ํŠผ์„ ์—ฐ๋‹ฌ์•„ ๋ˆ„๋ฅด๋Š” ๊ฒฝ์šฐ ์„œ๋ฒ„์— ์š”์ฒญ์ด ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฐ€์ง€ ์•Š๋„๋ก ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

ย 
ย 

call

ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ•จ์ˆ˜, ๋‚˜๋จธ์ง€ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ•ด๋‹น ํ•จ์ˆ˜์— ๋„ฃ์„ ์ธ์ˆ˜์ด๋‹ค.

ex.

notion image

call(delay, 1000) // delay(1000)

call ๊ณผ put ์˜ ์ฐจ์ด์ ์€ put์€ ์Šคํ† ์–ด์— ์ธ์ž๋กœ ๋“ค์–ด์˜จ action์„ dispatchํ•˜๊ณ , call์€ ์ฃผ์–ด์ง„ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

fork

ํ•จ์ˆ˜์˜ ๋น„๋™๊ธฐ์ ์ธ ํ˜ธ์ถœ์„ ํ•  ๋•Œ ์‚ฌ์šฉ, call๊ณผ ๋‹ฌ๋ฆฌ ์ˆœ์„œ ์ƒ๊ด€ ์—†์ด ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ

ex.

notion image

all( [ fork(fetchData) ] ) // all( [ fork(f1), fork(f2) ] ) f1๊ณผ f2๋ฅผ ์ˆœ์„œ ์ƒ๊ด€ ์—†์ด ์‹คํ–‰์‹œํ‚จ๋‹ค. all๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

all

all ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ œ๋„ค๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๋ฅผ ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋กœ ์ธ์ž์— ๋„ฃ์–ด์ฃผ๋ฉด, ์ œ๋„ค๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๋“ค์ด ๋ณ‘ํ–‰์œผ๋กœ ๋™์‹œ์— ์‹คํ–‰๋˜๊ณ , ์ „๋ถ€ resolve๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. Promise.all๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

ex.

notion image

all(fork(fetchData), debouce(500, types.TRY_SET_TEXT, trySetText) ] ); // fork(fetchData)์™€ debounce๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜๊ณ  ๋ชจ๋‘ resolve ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.