Redux sagas
Where to Ajax ?
Redux Sagas
- In a Redux applications, where should we place the Ajax code ?
Where to Ajax ?
Redux Sagas
Component
Reducer
Action, State
State
UX
Props
Redux dispatcher
Redux Connect
Pure
In reducer
or in component ?
Where to Ajax ?
Redux Sagas
- Reducer
- No - it is supposed to be pure
- Component
- Maybe
- What if data is needed in other components
- Component becomes complex
Redux-saga
Reducer
Action, State
Redux-saga
- Watch the dispatched actions
- Perform the async/impure actions
- Dispatch another action
Redux dispatcher
Add a Redux saga
Redux-saga
The flow with saga
- User clicks on Load data button
- Component dispatches LOAD_DATA action
- Saga, watching for LOAD_DATA action, captures it,
- Saga triggers the loading code (fetch etc)
- Saga dispatches the DATA_LOADED action, after loading finishes
- Reducer processes it, updates the state
- Redux updates the props, component re-renders
Redux-saga
Reducer
Action, State
Redux-saga
Redux dispatcher
The flow
Component
State
UX
Props
Redux Connect
Redux-saga
The code
function* mySaga () {
yield take(LOAD_DATA)
result = yield call(fetch_etc)
yield put(DATA_LOADED, result)
}
Introduction
Redux-saga
redux-saga is a library that aims to make application side effects (i.e. asynchronous things like data fetching and impure things like accessing the browser cache) easier to manage, more efficient to execute, simple to test, and better at handling failures
(from the documentation)
Side effects
Redux-saga
"asynchronous things like data fetching and impure things like accessing the browser cache"
=>
- asynchronous
- impure
Pure and impure
Redux-saga
- Are concepts from functional programming
- Pure - has no side effects
- No state should change, no data should be assigned, nothing in the environment should change
- No database changes. No changes to global data.
- No IO
Pure and impure - No I/O
Redux-saga
// Writing to console
function foo() {
console.log('Hello World');
}
// Ajax calls
function bar() {
fetch('some-url').then('display it');
}
Redux and pure functions
Redux-saga
- Redux reducers must be pure
- Then how do we make Ajax calls ?
Pure and impure - changing globals
Redux-saga
// location
function foo() {
location.href = 'http://google.com';
}
// localStorage
function bar() {
localStorage.set('x', 1)
}
Redux sagas
By Abhishek Yadav
Redux sagas
- 830