如何使用 thunk 和 useDispatch(react-redux 挂钩)从操作中返回承诺?

Posted

技术标签:

【中文标题】如何使用 thunk 和 useDispatch(react-redux 挂钩)从操作中返回承诺?【英文标题】:How to return a promise from an action using thunk and useDispatch (react-redux hooks)? 【发布时间】:2019-11-03 18:05:28 【问题描述】:

我刚开始探索 react-redux 钩子,我很好奇如果我使用 thunk 和 useDispatch(),如何返回一个 Promise。基本上我想实现以下目标:

const dispatch = useDispatch();

dispatch(myAction(...args)).then((result) => 
    ...do something with result
);

当我的动作看起来像这样时:

const myAction = (arg1, arg2) => 
    return (dispatch, getState) => 
        Promise.resolve(arg1 + arg2);
    

我已经大大简化了我的问题,但这基本上就是我要处理的问题。当我尝试调度上述操作时,我收到错误 dispatch(...).then is not a function。

我知道 redux 钩子是相当新的,但我很好奇是否有人让它工作或知道解决方案。我觉得完成这项工作应该相对容易,但我不知所措。如果您需要更多信息,请告诉我。提前感谢您的帮助!

【问题讨论】:

我几天前做过类似的事情,请看this file at line 74,该函数在第 20 行定义,并在获得异步操作调度结果后解析。行动是defined here希望对你有帮助! 我相信如果你兑现你的诺言,你可以连锁:return Promise.resolve(arg1 + arg2) 【参考方案1】:

dispatch 返回两个之一:

    对于同步操作(如dispatch (type: 'ACTION'),它将返回操作对象(在我的示例中为type: 'ACTION'

    对于 thunk 动作(返回函数的动作创建者),它返回的结果与动作创建者返回的结果相同。

因此,对于您的情况,只需为您的操作创建者添加 return 语句

const myAction = (arg1, arg2) => 
    return (dispatch, getState) => 
        return Promise.resolve(arg1 + arg2);
    

你可以像这样让myAction 更逼真

const myAction = (arg1, arg2) => 
    return (dispatch, getState) => 
        return fetch(/* some request */).then(response => dispatch (type: 'RESPONSE_RECEIVED', payload: response));
    

在这种情况下,也将返回已解决的承诺。承诺的内容将是对象type: 'RESPONSE_RECEIVED', payload: response

或者您可以像这样为返回的承诺设置任意内容

const myAction = (arg1, arg2) => 
    return (dispatch, getState) => 
        return fetch(/* some request */).then(response =>  
            dispatch (type: 'RESPONSE_RECEIVED', payload: response)
            return response;
        
    

在此示例中,将返回已解析的 promise,但其中包含 response

在所有情况下,您都可以随意链接

dispatch(myAction(...args)).then((result) => 
    ...do something with result
);

【讨论】:

以上是关于如何使用 thunk 和 useDispatch(react-redux 挂钩)从操作中返回承诺?的主要内容,如果未能解决你的问题,请参考以下文章

Redux 工具包,缺少调度 thunk 类型

基于 React Hooks 的应用程序真的需要 Redux Thunk 中间件吗?

如何清理 useEffect 中的 Redux“useDispatch”操作?

在Redux中使用useSelector和useDispatch

在Redux中使用useSelector和useDispatch

如何使用 jest/enzyme 测试 useEffect 与 useDispatch 挂钩?