Redux中间件返回的回调不是状态对象

时间:2019-08-25 07:03:41

标签: javascript reactjs redux

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

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

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

2。 第一个问题的扩展,如果有两个以上的中间件,并且有多个中间件返回回调而不是状态,那么这些回调都可以使用吗?我的意思是,要使用它们,只需像dispatch(actionCreater).CALLBACK_NAME()那样称呼它即可?

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

3 个答案:

答案 0 :(得分:1)

那如何通过链接中间件处理它?<​​/ p>

我认为链接刚刚停止。例如,从redux-thunk's code看,如果action是一个函数,则返回该函数的结果,而不会调用next;因此以下所有中间件均未处理此action

我认为这是合乎逻辑的,因为大多数中间件都希望action是对象而不是函数。如果传递此功能类型的操作,则这些中间件将崩溃。

以后如何在代码中到达此回调或Promise?

我认为您必须在调用dispatch之后立即处理它,这与您描述的内容差不多。“仅在调度(actionCreater)之后以链接方式调用它。”

redux-thunk示例一样

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

如果有两个以上的中间件,并且返回多个中间件 回调而不是状态,这些回调都可以使用吗?

我认为答案是“否”。因为链接已停止。如果某个特殊的中间件处理了任何特殊的action,则无法通过调用action来传递该next,否则特殊操作可能会破坏其他普通的中间件。

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

  1. 仅使用一种特殊的中间件,因此不会发生冲突。

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

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

答案 1 :(得分:0)

redux中间件将存储作为中间件的参数,您可以使用它来获取状态。您可以使用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存储, next store.dispatch相同, action 是当前执行的操作。< / p>

答案 2 :(得分:0)

我认为this question提出的问题与我差不多。遗憾的是,尚无明确答案