react / redux / sagas - 如何基于现有商店数据链接动作?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了react / redux / sagas - 如何基于现有商店数据链接动作?相关的知识,希望对你有一定的参考价值。
我试图根据状态是否包含数据来触发传奇内部的操作。
由于我已经有了从书籍/游戏中获取数据的传闻,我想重用该功能。如果商店没有那些数据,我只想解雇那些。
到目前为止这是我的代码......
function* getAllSaga(action) {
try {
let books = yield select(Selectors.books);
let games = yield select(Selectors.games);
if(!books.length || !games.length){
yield put({ type: 'GET_BOOKS' });
yield put({ type: 'GET_GAMES' });
}
books = yield select(Selectors.books);
games = yield select(Selectors.games);
const concated = books.concat(games);
yield put({ type: 'GET_ALL_SUCCEEDED', all: concated });
} catch (err) {
yield put({ type: 'GET_ALL_FAILED', message: err.message });
}
}
我该怎么解决这个问题?
答案
put
s是非阻塞的,因此您需要修改代码,以便等待新数据,如下所示:
function* getAllSaga(action) {
try {
let books = yield select(Selectors.books);
let games = yield select(Selectors.games);
if(!books.length || !games.length){
yield put({ type: 'GET_BOOKS' });
yield put({ type: 'GET_GAMES' });
yield all([
take('GET_BOOKS_SUCCEEDED'),
take('GET_GAMES_SUCCEEDED')
])
books = yield select(Selectors.books);
games = yield select(Selectors.games);
}
const concated = books.concat(games);
yield put({ type: 'GET_ALL_SUCCEEDED', all: concated });
} catch (err) {
yield put({ type: 'GET_ALL_FAILED', message: err.message });
}
}
以上是关于react / redux / sagas - 如何基于现有商店数据链接动作?的主要内容,如果未能解决你的问题,请参考以下文章
react redux Reduc-saga实现 take put takeEvery createSagaMiddleware等
访问 saga 中的 store.dispatch 以与 react router redux 一起使用