fetch() 什么时候在 Redux 中发生?

When does fetch() happen in Redux?

我在控制 fetch() 函数的执行时遇到问题。特别是我想避免让用户发送垃圾邮件 fetch() 请求。

我的想法是在中间件内部执行此操作,但是当带有 fetch() 的操作到达那里时,有效负载已经是一个承诺。

所以我的问题是,什么时候 fetch() 已经执行了?

如果重要,那么我的代码大致如下所示。

家长操作:

{
  return (dispatch) => {
    if (mode === 'MY') {
      dispatch(myAction(...);
    }

    dispatch(someOtherAction(...));
  } 
}

我的操作:

{
  type: 'TYPE',
  promise: post(url, payload)
}

我的post方法:

 {
   console.log('sending POST');

   return fetch(url, {
     //fetch info
   });
 }

我的中间件:

{
  return next => action => {

    const { promise, //other fields } = action;
    //Already a promise here.

    if (!promise) {
      return next(action);
    }

    return promise.then(
      //Processing data
    );
  };
}

My idea was to do this inside of middleware, but by the time the action with a fetch() gets there the payload is already a promise.

为了解决这个问题,我会在动作中进行检查。因此,当您触发获取请求时,分派获取当前正在执行的操作,更新状态为 fetching = true。然后在任何其他需要使用 fetch 的操作中,检查该状态,如果为真,return什么都不做。

回答您的评论:

当您调用动作创建器时,当然会立即调用。当您调用调度时,它将执行该函数(如果使用 redux-thunk)。现在,由于 redux-thunk 是一个中间件,它会根据您附加中间件的顺序执行。所以如果你把自己的中间件放在redux thunk之前的setup中,它会先于它执行。

const store = createStore(
  combineReducers(reducers),
  applyMiddleware(yourMiddleware, ReduxThunk)
);

否则你的理解是正确的。一个 action 在调用 dispatch 后立即触发,它会按顺序通过中间件,然后将 action 信息传递给你的 reducers。