javascript - 如何使用 thunk 和 useDispatch(react-redux Hook )从操作中返回 promise ?

标签 javascript reactjs redux react-redux redux-thunk

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

const dispatch = useDispatch();

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

当我的 Action 看起来像这样时:

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

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

我知道 redux hooks 很新,但我很好奇是否有人已经让它工作或者知道解决方案。我觉得完成这项工作应该相对容易,但我很茫然。如果您需要更多信息,请告诉我。在此先感谢您的帮助!

最佳答案

作为 dispatch 返回两个之一:

  1. 对于同步操作(如 dispatch ({type: 'ACTION'}) 它将返回操作对象({type: 'ACTION'} 在我的示例)

  2. 对于 thunk Action (返回函数的 Action 创建者),它返回从 Action 创建者返回的相同结果。

因此,对于您的情况,只需为您的 Action 创建者添加 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}));
    }
}

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

或者你可以像这样为返回的 promise 设置任意内容

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
});

关于javascript - 如何使用 thunk 和 useDispatch(react-redux Hook )从操作中返回 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56694102/

相关文章:

reactjs - 错误 : Actions must be plain objects. 相反,实际类型为 : 'function' . 您可能需要将中间件添加到您的商店设置中

javascript - 按 event_id 过滤门票

javascript - 将过滤后的集合传递给 Angular 指令会导致异常

javascript - 使用 querySelector 通过 InnerHTML 选择元素

javascript - Reactjs - phantomjs-node 与 "fs"模块相关的问题

javascript - Material UI - 工具提示意外显示

javascript - 页面刷新后如何从选择器获取状态?

javascript - 在 ng-repeat angularJS 中仅隐藏和显示每个对象的输入字段

JavaScript scrollBy(x,y) 不适用于 Android WebView 中的样式列宽

javascript - 屏幕不滚动 Expo web