Redux:按顺序调度动作

Redux: Dispatch actions in sequence

我正在 Redux 上创建一个 Reddit 客户端,我在应用程序中触发了 2 个商店调度:

// App()
const dispatch = useDispatch();

useEffect(() => {
    const stateMatch = window.location.href.match(/state=([^&]*)/);
    const codeMatch = window.location.href.match(/code=([^&]*)/);

    if ((stateMatch && codeMatch) || localStorage.getItem("access_token")) {
        dispatch(fetchUser());
        dispatch(fetchSubs());
    }
});

...

但是,我希望 fetchUser() 到 运行 并在 fetchSubs() 开始之前完成,因为前者目前似乎破坏了 API 对后者的调用,而它 运行宁。我该如何解决?

由于您使用的是 createAsyncThunk,您可以这样做:

  dispatch(fetchUser())
  .unwrap()
  .then((user) => {
    // do anything you want with user, or don't, also dispatch actions
    dispatch(fetchSubs());
  })
  .catch((e) => {
    // error in case of rejection inside createAsyncThunk second argument
    console.log(e);
  });

说明

假设const thunk = fetchUser() 所以基本上 dispatch(fetchUser())dispatch(thunk).

相同

Redux 的 dispatch 函数 returns 无论其参数(动作)如何 returns.

所以在这种情况下,dispatch(thunk) returns 无论如何 thunk returns。

thunk,根据 createAsyncThunk 的工作方式,returns 承诺要么解析为完成的操作,要么解析为被拒绝的操作。 (你在额外的减速器中收到的那些动作)。

您可以通过以下方式访问这些操作:

dispatch(thunk).then(fullfilledAction=>...).catch(rejectedAction=>...`

RTK 库还提供了一种叫做unwrap 的方法。它允许您使用 createAsyncThunk.

的第二个参数的返回值,而不是我上面解释的那些操作对象
export const fetchUser = createAsyncThunk("user/fetchUser", async () => {
const user = await Reddit.getUser().then(val => {
    return val;
});

return user; // unwrap lets you use this instead of action objects.
})

尝试使用纯 React 和 redux 钩子

...

const state = useStore(yourStore) //use your method to read state 
const dispatch = useDispatch();
const checkValue = () => {
   const stateMatch = window.location.href.match(/state=([^&]*)/);
    const codeMatch = window.location.href.match(/code=([^&]*)/);

    if ((stateMatch && codeMatch) || localStorage.getItem("access_token")) {
        return true;
    }
    return false;
}

useEffect(() => {
    if(checkValue())
        dispatch(fetchUser());
    }
}, []);

useEffect(() => {
    if(checkValue() && state.authState)
        dispatch(fetchSubs());
    }
}, [state.authState]);


...