【问题标题】:Redux middleware returning callbacks not state objectRedux 中间件返回回调而不是状态对象
【发布时间】:2019-12-29 19:41:37
【问题描述】:

我是 Redux 的新手,我有一些令人困惑的问题:

1。 The official docs 表示在使用中间件时,每个中间件函数都可以返回除新状态对象(next(action))以外的函数或 Promise(即使不使用 redux-thunk)。如果是这种情况,以后如何在代码中达到这个回调或承诺?直接在dispatch(actionCreater)之后链式调用?

在上述情况下,返回的是函数回调而不是对象,那么如何通过链式中间件处理呢?

2。 第一个问题的扩展,如果有超过 2 个中间件和几个中间件返回回调而不是状态,这些回调是否都可以使用?我的意思是,要使用它们,只需将其称为 dispatch(actionCreater).CALLBACK_NAME()?

如果回调偶然有相同的名称,如何处理?

【问题讨论】:

    标签: javascript reactjs redux


    【解决方案1】:

    那么它是如何通过链式中间件处理的呢?

    我认为链接刚刚停止。比如看redux-thunk's code,如果action是一个函数,则返回那个函数的结果,而next不会被调用;所以以下所有中间件都没有处理这个action

    我认为这是合乎逻辑的,因为大多数中间件都期望 action 是对象而不是函数。如果传递这个函数类型的动作,那些中间件就会坏掉。

    以后如何在代码中达到这个回调或承诺?

    我认为您必须在调用dispatch 后立即处理它,几乎就是您所描述的“只需在 dispatch(actionCreater) 之后以链接方式调用它”

    就像redux-thunk 的例子

    dispatch(makeASandwichWithSecretSauce('My partner')).then(() => {
      console.log('Done!');
    });
    

    如果有超过 2 个中间件并且有几个中间件返回 回调而不是状态,这些回调都可以使用吗?

    我认为,答案是“不”。因为链接停止了。如果某个特殊的action被某个中间件处理,那么这个action不能通过调用next来传递,否则这个特殊的动作可能会破坏其他正常的中间件。

    所以我想有几种解决方案:

    1. 只使用一种特殊的中间件,不会有冲突。

    2. 如果有多个特殊中间件,手动组合所有这些中间件,使其成为新的中间件,然后将新的中间件发送到reduxapplyMiddleware

    3. 使用一些更通用/更强大的中间件来处理复杂的异步行为,例如redux-saga

    2的想法大概是这样的

    const manually = store => next => action => {
      if (typeof action === 'function') {
        const promise = thunk(action);
        const promise2 = anotherThunk(action);
    
        // this is also tricky, because action is a function, you have to make a new object
        const whatToPass = {
          type: 'what is this', // depends on your need?
          // any other data?
        };
        next(whatToPass); // chaining goes on
    
        // maybe return this, but maybe not good,
        // because every promise needs to resolve to trigger the 'then'
        return Promise.all([
          promise,
          promise2,
        ]);
      }
      return next(action);
    }
    

    【讨论】:

    • 与我目前所了解的非常相似的结论。我认为我可以在dispatch 之后使用.then() 并使用resolvereject 管理流程这一事实改善了异步行为。但正如您所提到的,使用redux-saga 以更复杂的方式进行控制会更好。
    • 很高兴我们有相似的想法:D,是的,我真的很喜欢redux-saga,我觉得它可以在人类可读的流程中编写业务逻辑,易于维护;并且可以将异步/复杂逻辑与 UI 组件隔离开来,但此语句是逐个案例的,因为有时您可能只想在组件内编写所有逻辑,但如果逻辑是跨组件的,那么 saga 是一个好地方。
    【解决方案2】:

    redux 中间件将 store 作为中间件的参数,您可以使用它来获取状态。您可以使用store.getState() 获取状态。中间件回调结构如下......

    const customMiddleware = store => next => action => {
       const result = next(action);
       console.log("State", store.getState());
       console.log("Action", action.type);
       return result;
    }
    

    其中store是redux store,nextstore.dispatch一样,action是当前执行的动作。

    【讨论】:

    • 感谢您的回复,但这不是我想要的。
    【解决方案3】:

    我认为this question 几乎问了我遇到的类似问题。可悲的是,目前还没有明确的答案

    【讨论】:

      猜你喜欢
      • 2011-01-13
      • 1970-01-01
      • 2021-04-01
      • 2021-12-18
      • 2017-12-08
      • 2018-05-10
      • 2019-12-04
      • 2021-01-20
      • 1970-01-01
      相关资源
      最近更新 更多