シナリオ
2つのAPI呼び出しがあります
- ユーザーIDを取得するためにA(呼び出し)を要求します
- userId (ex. /${userId}/detail) を使用して B (呼び出し) を要求します。
応答データはreduxストアに保存されます
- userId がグローバル状態として既に存在する場合は、この値を使用して B リクエストを作成できます。
- userId がグローバル状態として存在しない場合は、B を要求する前に A を要求し、次に userId がグローバル状態に追加されたときに B を要求します (同期的に操作する必要があります) 。
私は次の方法で試しました:
- 約束を使用します。ここでは、userId がストアに存在するかどうかを確認しません。userId がストアに存在する場合でも、無条件に 2 回要求するため、これは好ましくありません。
export const getUserDetailData = createAsyncThunk(
'user/detail',
(url: string, { getState, dispatch }) => {
dispatch(getUserData())
.then((user)=> client.get(`/${user.id}/${url}`))
.then(res=>res)
}
);
- redux-thunkが提供する関数(getState)を利用した方法です。
export const getUserDetailData = createAsyncThunk(
'user/detail',
async (url: string, { getState, dispatch }) => {
// "getState()" method to check if the desired data is present
if (!(getState() as RootState).user.data) {
// If there is no userId, a request is made to get the user's id.
await dispatch(getUserData());
}
// Get the value of the global store again and use userId
const userId = (getState() as RootState).user.data
const response = await client.get<APIData<any>>(`/${userId}/${url}`);
return response;
}
);
質問
私が疑問に思っているのは、
ケース 2 の場合、毎回 getState でリアルタイムに保存された値を呼び出して使用するよりも、サンク スタイルの方法はありますか?