Redux-Thunk Chaining Actions,得到一个“dispatch(...)然后不是函数错误

Posted

技术标签:

【中文标题】Redux-Thunk Chaining Actions,得到一个“dispatch(...)然后不是函数错误【英文标题】:Redux-Thunk Chaining Actions, getting a "dispatch(...) then is not a function error 【发布时间】:2017-12-27 22:00:51 【问题描述】:

为了让我设置合成,我必须先获取输出对象。 我正在尝试复制示例,我觉得我正在正确复制语法,但我不断收到错误:

未捕获的 TypeError: dispatch(...).then 不是函数

Actions.js

export function setComposition(composition) 
  return  type: types.SET_COMPOSITION, composition ;


export function setOutputs(outputs) 
  return  type: types.SET_OUTPUTS, outputs ;


export function setOutputsAndComposition(outputs) 
  return function (dispatch, getState) 
    return dispatch(setOutputs(outputs)).then(() =>  // ERROR HERE
      dispatch(setComposition(getState().Data.OutputObj))
    );
  

编辑:理想情况下,我只想创建一个功能:

export function setOutputsAndComposition(outputs) 
  return function (dispatch, getState) 
    dispatch(setOutputs(outputs)).then(() =>
    dispatch(setComposition(getState().Data.OutputObj))
    );
  

但我显然没有正确地使用语法

【问题讨论】:

【参考方案1】:

setOutputs() 正在返回一个普通的操作对象,因此不是一个返回承诺的 thunk。所以,链接dispatch(setOutputs(outputs)).then() 是行不通的。

如果你只是想在setOutputs()调度完成后立即调度另一个动作,你只需要把它们放在一个之后:

dispatch(setOutputs(outputs));
dispatch(setComposition(getState().Data.OutputObj));

【讨论】:

如果我想让 ".then()" 工作,我的 setOutputs 函数必须返回什么? 正如我所说,它需要是另一个 thunk 函数,并且需要返回一个承诺。 @markerikson:你的意思是 thunk 中的 dispatch 就像 saga 中的 yield 一样。我的观点是,假设如果您希望某个动作在另一个动作之后调度 - 我们需要使用 .then 来确保第一个动作已经返回。 你混淆了两种不同的东西。 thunk 中的 dispatch 参数与 Redux 存储中的 store.dispatch 方法完全相同。 yield 是一个 JS 关键字,用于暂停 saga 并将值传递给迭代器。 Redux-Saga API 允许您使用put() 效果进行调度,例如yield put(type: "increment") @markerikson :我明白了你的意思,但是当你上面提到当需要调度 2 个动作时,你需要在另一个调度之后立即调度,我想知道第二个调度是否会等待如果第一个调度需要时间返回,则第一个返回并且不开始执行。我有一个用例,我想连续调度 2 个动作,但第二个动作应该在第一个动作返回后才开始,使用 .then 给出错误【参考方案2】:

您可以使用setOutputs() 作为自定义中间件。在这种情况下,我将其用作Promise

export function setComposition(composition) 
  return  type: types.SET_COMPOSITION, composition ;


export function setOutputs(outputs, dispatch) 
  return new Promise((resolve, reject) => 
    dispatch(type: types.SET_OUTPUTS, outputs);
    resolve();
  );


export function setOutputsAndComposition(outputs) 
  return function (dispatch, getState) 
    return setOutputs(outputs, dispatch).then(() =>  // NO ERROR HERE ANYMORE ^_^
      dispatch(setComposition(getState().Data.OutputObj))
    );
  

【讨论】:

感谢替代方法。检查出来 看来这种方法不可行,会导致另一个错误 - Uncaught Error: Actions must be plain objects. Use custom middleware for async actions. 它建议您必须使用中间件,例如 redux-thunk 进行此类操作

以上是关于Redux-Thunk Chaining Actions,得到一个“dispatch(...)然后不是函数错误的主要内容,如果未能解决你的问题,请参考以下文章

jQuery Chaining

jQuery - Chaining

jQuery - Chaining 链接技术

jQuery - 链(Chaining):把动作/方法链接在一起

jQuery - 链(Chaining)

可选链plugin-proposal-optional-chaining的使用