Redux Saga
思路:用了很多Generator函数,通过yield解决异步同步问题。
yield的大概意思是我先返回一部分,但是这个函数会被这个返回的操作阻塞。如果是一个Promise,这个函数将会等待知道这个promise被resolve。
然后所有的saga函数都带*,这也是generator关键的一部分。
一些思考:Generator模式ES7才引入支持,是不是要考虑很多shim,shim的性能又怎么样?
101
为了运行我们的 Saga,我们需要:
创建一个 Saga middleware 和要运行的 Sagas(目前我们只有一个 helloSaga) 将这个 Saga middleware 连接至 Redux store. 首先我们引入 ./sagas 模块中的 Saga。然后使用 redux-saga 模块的 createSagaMiddleware 工厂函数来创建一个 Saga middleware。
// ...
import { createStore, applyMiddleware } from 'redux'
import createSagaMiddleware from 'redux-saga'
//...
import { helloSaga } from './sagas'
const store = createStore(
reducer,
applyMiddleware(createSagaMiddleware(helloSaga))
)
// rest unchanged
然后Saga分类别:worker saga和watcher saga(
takeEvery才是真正处理的函数,接收一个消息,还有一个回调。
// Our worker Saga: 将执行异步的 increment 任务
export function* incrementAsync() {
yield delay(1000)
yield put({ type: 'INCREMENT' })
}
// Our watcher Saga: 在每个 INCREMENT_ASYNC action spawn 一个新的 incrementAsync 任务
export function* watchIncrementAsync() {
yield takeEvery('INCREMENT_ASYNC', incrementAsync)
}