Reactjs 关于Redux thunk,如果处理程序分派要调用的函数,为什么不直接调用它呢?

Reactjs 关于Redux thunk,如果处理程序分派要调用的函数,为什么不直接调用它呢?,reactjs,redux,redux-thunk,Reactjs,Redux,Redux Thunk,据我所知,这是可能的 <button onClick={fn1}>Click Me</button> 但是为什么不直接调用fn1来完成任务,而是让中间件调用它呢?Redux Thunk是一种非常精简的中间件(如14行精简),它引入了一种约定,即Redux应该知道如何为您处理异步进程 你说 问题是你确实希望fn2立即开火。例如:用户点击 一个按钮来获取一些东西,您确实需要执行 抓取或立即开火。我想用redux thunk,如果你 分派一个函数,它会立即被激发 你说得对,你

据我所知,这是可能的

<button onClick={fn1}>Click Me</button>
但是为什么不直接调用
fn1
来完成任务,而是让中间件调用它呢?

Redux Thunk是一种非常精简的中间件(如14行精简),它引入了一种约定,即Redux应该知道如何为您处理异步进程

你说

问题是你确实希望fn2立即开火。例如:用户点击 一个按钮来获取一些东西,您确实需要执行 抓取或立即开火。我想用redux thunk,如果你 分派一个函数,它会立即被激发

你说得对,你想让它立即启动,但你想成为手动连接调用函数并传递调度的人,还是想让Redux Thunk帮你完成

不管怎样,Redux都需要在稍后的某个时间发送一个操作。Redux Thunk为你做“稍后”

考虑这些差异:

const存储={
调度(){
控制台日志(“调度”);
}
};
//重新运行操作的操作创建者
康斯特公司=()=>({
类型:“增量”
});
//你不应该使用的不纯洁的行为创造者
常量BADANCINC=()=>{
设置超时(()=>{
仓库调度({
类型:“增量”
});
}, 1000);
};
//返回以分派为参数的函数的操作创建者
常量aInc=()=>dis=>setTimeout(()=>dis({
类型:“增量”
}), 1000);
/*
*以下将执行所有操作,包括等待发货
*然后送到商店。这很好,但对我来说不好
*当我们想使用不同的商店时。
*/
badancync();
/*
*以下是延迟电路的“手动”接线方式
*没有Redux Thunk的情况下你必须做的调度。
*/
aInc()(store.dispatch);
/*
*使用Redux Thunk,这将立即调用“fn2”,但也会
*将分派函数传递给“fn2”,这样您就不会
*你得自己接线。
*/
仓库调度(aInc);
在本例中,您只需调用
badancinc
即可,因为它将为您调用
store.dispatch
。但是如果你有多家商店呢?如果您想使用测试线束“存储”,该怎么办?如果你想彻底地嘲笑这个商店呢?您的
badAsyncInc
现在与存储结合在一起,这对操作创建者来说是不好的

或者,您可以自己调用
aInc
并向其传递分派函数。但是,当您的所有其他动作创建者都可能被编写为
store.dispatch(actionCreator())
时,为什么要这样做呢。Redux Thunk帮助您保持这种模式,即使是异步操作

Redux Thunk试图帮助您编写松散耦合且可测试的动作创建者

在fn1中,它不分派动作对象,而是分派函数fn2

分派函数背后的动机是函数包含一个分派参数(Redux Thunk提供)供您使用

下面是一个示例,说明了调度功能的强大程度:

const action = (url) => async (dispatch) => {
    try {
        const response = await fetch(url);
        dispatch(success(response));
    } catch (error) {
        dispatch(failure(error));
    }
}
分派使您能够分派成功或失败操作,以便减速器处理

更多详情:

如果处理程序分派要调用的函数,为什么不直接调用它呢


如果它被立即调用,您就无法完全执行上述操作:在解析获取或任何异步调用之后调度后续操作。

因为这样会立即触发
fn2
,而不是在
获取
完成之后,还是我误解了你的问题?@zero298问题是你确实希望
fn2
立即开火。例如:用户单击按钮获取内容,您确实希望执行
获取
或Ajax的函数立即启动。我认为使用
redux thunk
,如果您分派一个函数,它会立即被激发,应该是
aInc()(store.dispatch)相反?@stackoverflow新手是的,我想你是对的。抢手货
const action = (url) => async (dispatch) => {
    try {
        const response = await fetch(url);
        dispatch(success(response));
    } catch (error) {
        dispatch(failure(error));
    }
}