[Redux] redux-saga 筆記
觀念
- 在 redux-saga 中,當在
yield
後接上Promise
時,middleware 會把 Saga 停住,直到這個 Promise 被 resolve 後才繼續執行。 - 一旦 Promise 被 resolve 之後,middleware 會讓 Saga 繼續執行到下一次的 yield 才停住。
- 在 redux-saga 中會從 Generator 中產生(yield)許多的 JavaScript 物件,這些物件包含了指示,因此我們把這樣的物件稱作「effect」,這些物件的指示會告訴 middleware 現在要執行哪些動作(例如,執行非同步的函式、向 store 發出 dispatch 等等)。
- 在 redux-saga 中有許多不同的 effect(例如,
put
),effect 是一個帶有指示的物件,需要透過 middleware 來完成,當 middleware 收到 Saga 產生(yield)的 effect 時,Saga 會停住,和 Promise 的情況相似,需要直到這個 effect 被完成後才會繼續。也就是說,不論是put
或call
他們都沒有真正去執行 dispatch 或非同步的呼叫,他們只是回傳一個 JavaScript 物件: - Saga 可以透過很多不同的形式產生 effect,其中最簡單的一中方式就是 Promise。
put({ type: 'INCREMENT' }); // => { PUT: {type: 'INCREMENT'} }
call(delay, 1000); // => { CALL: {fn: delay, args: [1000]}}
- 真正做事的地點是在 middleware 中,它會根據 effect 的類型來決定要如何完成這個 effect。如果 effect 是
PUT
的話,那麼他會 dispatch 一個 action 到 store 中;如果 effect 是CALL
,那麼就會呼叫被給予的函式。