将参数传递给saga dispatch - 并将参数传递给处理程序

时间:2017-07-31 02:40:07

标签: redux-saga

这是我的传奇:

function* upAsyncSaga() {
    yield takeEvery(UP_ASYNC, upAsyncHandler);
}

以下是相关的同步资料:

const UP_ASYNC = 'UP_ASYNC';
export function upAsync() {
    return {
        type: UP_ASYNC
    }
}
function* upAsyncHandler() {
    yield call(wait, 1000);
    yield put(up());
}

const UP = 'UP';
export function up() {
    return {
        type: UP
    }
}

我通过执行upAsyncSaga来触发store.dispatch(upAsync())。但是我想传递一个名为times的参数。所以我想做store.dispatch(upAsync(3))然后我希望/想要获得像这个伪代码的处理程序的参数:

export function upAsync(times) { // this is the argument "times"
    return {
        type: UP_ASYNC
        times // here it is again
    }
}
function* upAsyncHandler(times) { // i want the argument to get to the handler
    for (let i=0; i<times; i++) {
        yield call(wait, 1000);
        yield put(up());
    }
}

这可能吗?

1 个答案:

答案 0 :(得分:2)

当我们将任何行动发送到商店时,我们可以包含这样的参数(有效载荷):

store.dispatch( { type: UP_ASYNC, payload : { times: 2 }})

修改你的功能:

export function upAsync(type, payload) {
  const { type, times } = payload
    return {
        type: type,
        times: times
    }
}

我不确定您的完整商店实施情况如何,但如果您遵循redux-saga,上述内容应该可以解决您的问题。

编辑:

如果你有具有效果的redux商店(我相信),那么你可以简单地执行这样的动作:

dispatch({type: '<namespace>/upAsyncHandler', payload: {type: UP_ASYNC, times: 2}})

此处,&#39;命名空间&#39;表示在redux存储中的命名空间,其中处理程序被定义为效果。见下文:

*upAsynHandler(action, { call }) {
  const { type, times } = action
  const res = yield call(wait, times)
}