Redux-Part-III

前情提要

角色

  • 生產者 - 產出任務 store.dispatch
  • 消費者 - 消費任務 saga function
  • channel - 暫存任務的地方

Redux-Saga 的組成

  • createMiddleware
  • effects
  • Channel

createMiddleware

基於 redux 所以要建立一個 sagaMiddleware

createMiddleware

會回傳一個 sagaMiddleware

sagaMiddleware

sagaMiddleware 有一個 run 的參數

他是之前說過的 Generator Runner

sagaRunner

在這個 Function 中 會利用 saga 產生 iterator

Channel

之前在生產者產生 task 之後需要有一個 channel 來暫存

這就是暫存的地方

預設會有一個 channel(之後有機會再說)

自己產生的話就可以用 actionChannel

watcher.js

1
2
3
4
5
6
7
8
9
10
11
import types from "../constants/actionTypes";
import { take, call, takeLatest, actionChannel } from 'redux-saga/effects';
import { loginSaga, logoutSaga } from './authSaga';

export function* watchLogin() {
yield takeLatest(types.LOGIN, loginSaga);
}

export function* watchLogout() {
yield takeLatest(types.LOGOUT, logoutSaga);
}

一般需要使用動併發的時候可以這樣處理

但是因為使用的是 takeLatest

所以當有重複的 Action 的時候

他會取消上一個 Action

但是如果我們希望可以一個一個處理

所有還沒處理到的 Action 先暫存一個地方

希望能有一個 queue 的機制

這時候可以利用 actionChannel

new watcher.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import types from "../constants/actionTypes";
import { take, call, takeLatest, actionChannel } from 'redux-saga/effects';
import { loginSaga, logoutSaga } from './authSaga';

export function* watchLogin() {
const requestChan = yield actionChannel(types.LOGIN);
while(true) {
const actionObject = yield take(requestChan);
yield call(loginSaga, actionObject);
}
}

export function* watchLogout() {
yield takeLatest(types.LOGOUT, logoutSaga);
}

上述的是利用 channel 暫存 task

由於使用 call 來做強制執行完之後

再由 while(true) 會重複執行下一個新的 task

Container

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import types from '~/constants/actionTypes';
import { connect } from 'react-redux';
import LoginScreen from './view';

const loginAction = payload => ({
type: types.LOGIN,
payload
});

const mapStateToProps = ({ auth }) => ({
auth
});

const mapDispatchToProps = dispatch => ({
handleLogin: payload => {
dispatch(loginAction(payload))
},
});

export default connect(mapStateToProps, mapDispatchToProps)(LoginScreen);

在 container 有描述 dispatch 產生新的 task

再由 saga 進行消費

參考資料

createMiddleware

Recipes

RNSkelton

文章目录
  1. 1. 前情提要
  2. 2. Redux-Saga 的組成
    1. 2.1. createMiddleware
      1. 2.1.1. sagaMiddleware
        1. 2.1.1.1. Channel
        2. 2.1.1.2. watcher.js
        3. 2.1.1.3. new watcher.js
      2. 2.1.2. Container
  3. 3. 參考資料
|