redux - react/redux/sagas - 如何根据现有的商店数据链接操作?
问题描述
我正在尝试根据状态是否包含数据来触发 saga 内部的操作。
由于我已经有了从书籍/游戏中获取数据的 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 });
}
}
推荐阅读
- java - Box2D Fixture 没有得到与其 FixtureDef 相同的类别和掩码位
- django - Django 使用 GET ajax Call on button click 获取特定的 QuerySet
- mysql - 检查表中的两个值
- java - 使用带有泛型的原始类型时减少潜在的多余垃圾?
- python - 服务 chromedriver 意外退出。状态码是:-9
- python - 使用 pandas 将对象(数值)转换为日期时间
- android - 当我单击添加按钮时,添加一个带有生成编号的recycleview数组
- c# - 如果数据库中已经存在一个项目,如何更新它的数量
- python - 使用多处理嵌套并行进程
- docker - 为什么 Docker 的注册表在运行它的容器时不需要设置主机网络模式来使用主机的 FQDN 访问它?