【发布时间】:2016-10-12 19:25:12
【问题描述】:
作为 redux-saga 的新手,我正在尝试设置一个 saga,它对动作 LANGUAGE_START_CYCLE 做出反应,并每 3 秒循环一次动作 LANGUAGE_CYCLE。
但是当我将LANGUAGE_START_CYCLE 发送到 Redux 商店时,传奇 LANGUAGE_CYCLE 从未像我预期的那样运行。
知道我做错了什么吗?我怀疑这是一个简单的错误,因为我的其他 sagas 运行良好。
// constants/ActionTypes.js
export const LANGUAGE_SET_ACTIVE = "LANGUAGE_SET_ACTIVE";
export const LANGUAGE_START_CYCLE = "LANGUAGE_START_CYCLE";
export const LANGUAGE_STOP_CYCLE = "LANGUAGE_STOP_CYCLE";
export const LANGUAGE_CYCLE = "LANGUAGE_CYCLE";
// actions/language.js
export const cycleLanguage = () => {
return {
type: ActionTypes.LANGUAGE_CYCLE
}
};
// languageSaga.js
import { actionChannel, call, take, put, race } from 'redux-saga/effects'
import * as ActionTypes from '../constants/ActionTypes';
import * as actions from '../actions/language';
const wait = ms => {
new Promise(resolve => {
setTimeout(() => resolve(), ms)
})
};
export default function * languageSaga() {
const channel = yield actionChannel(ActionTypes.LANGUAGE_START_CYCLE);
while (yield take(channel)) {
while (true) {
const { stopped } = yield race({
wait: call(wait, 3000),
stopped: take(ActionTypes.LANGUAGE_STOP_CYCLE)
});
if (!stopped) {
yield put(actions.cycleLanguage());
} else {
break;
}
}
}
}
// sagas.js (root sagas)
export default function * sagas() {
yield [
directorySaga(), // Another saga which works fine
pusherSaga(), // Another saga which works fine
languageSaga()
]
}
我的其他 sagas 之一的示例,它们正在运行:
// directorySaga.js
function * fetchDirectory(action) {
try {
const directory = yield call(Api.fetchDirectory, action.id);
yield put(fetchDirectorySucceeded(directory));
} catch (e) {
yield put(fetchDirectoryFailed(e.message));
}
}
export default function * directorySaga() {
yield * takeLatest(ActionTypes.DIRECTORY_REQUESTED, fetchDirectory);
}
【问题讨论】:
-
抱歉,您并没有真正说出这里出了什么问题,因此很难为您提供帮助。你发送什么,你期望什么,你得到什么?
-
问题是当我发送
LANGUAGE_START_CYCLE时,传奇并没有运行我的比赛效果。我试图到处尝试/捕捉,但没有任何输出。有关如何更好地解决此问题的任何提示? -
放置日志并告诉哪些打印或不打印。我什至不知道你是否会进入那里的循环:)
-
哇,刚刚做了一些观察。我要自己回答这个问题,你会感到惊讶(也许):-)
标签: javascript reactjs redux redux-saga