Redux thunk:从调度操作中返回承诺

Redux thunk: return promise from dispatched action

本文关键字:返回 承诺 操作 调度 thunk Redux      更新时间:2023-09-26

是否可以从操作创建者返回承诺/信号,当 Redux thunk 成功调度某些操作时解决?

请考虑此操作创建者:

function doPost(data) {
    return (dispatch) => {
        dispatch({type: POST_LOADING});
        Source.doPost() // async http operation
            .then(response => {
                dispatch({type: POST_SUCCESS, payload: response})
            })
            .catch(errorMessage => {
                dispatch({type: POST_ERROR, payload: errorMessage})
            });
    }
}

当 Redux 调度POST_SUCCESS或POST_ERROR操作时,我想在调用 doPost 操作创建器后在组件中异步调用某些函数。一种解决方案是将回调传递给操作创建者本身,但这会使代码变得混乱且难以掌握和维护。我也可以在 while 循环中轮询 Redux 状态,但效率低下。

理想情况下,解决方案将是一个承诺,当某些操作(在本例中为POST_SUCCESS或POST_ERROR)被调度时,它应该解决/拒绝。

handlerFunction {
  doPost(data)
  closeWindow()
}

上面的示例应该重构,因此 closeWindow() 只有在 doPost() 成功时才被调用。

当然,您可以从异步操作中返回承诺:

function doPost(data) {
    return (dispatch) => {
        dispatch({type: POST_LOADING});
        // Returning promise.
        return Source.doPost() // async http operation
            .then(response => {
                dispatch({type: POST_SUCCESS, payload: response})
                // Returning response, to be able to handle it after dispatching async action.
                return response;
            })
            .catch(errorMessage => {
                dispatch({type: POST_ERROR, payload: errorMessage})
                // Throwing an error, to be able handle errors later, in component.
                throw new Error(errorMessage)
            });
    }
}

现在,dispatch函数返回一个承诺:

handlerFunction {
  dispatch(doPost(data))
      // Now, we have access to `response` object, which we returned from promise in `doPost` action.
      .then(response => {
          // This function will be called when async action was succeeded.
          closeWindow();
      })
      .catch(() => {
          // This function will be called when async action was failed.
      });
}