Redux запрашивает несколько createApi и редуктора с повторной выборкой

Мое приложение должно получать данные с трех разных серверов, все они подключены к одной БД. Таким образом, я разделил код на 3 разных API-интерфейса createAPI и использовал разные пути к редуктору, однако кажется, что я не могу использовать повторную выборку, если выполняю редактирование PUT из API A, но API B также требует обновления.

Я не могу изменить расположение серверов, поскольку это наша архитектура серверных серверов.

export const commonApi = createApi({
  reducerPath: "commonApi",
  baseQuery: commonBaseQuery, //URL: common.dev.example.com
  endpoints: () => ({}), //later injected
  tagTypes: ["SCHEME_LIST", "SCHEME_DETAIL"],
});

export const taskApi = createApi({
  reducerPath: "taskApi",
  baseQuery: taskBaseQuery, //URL: task.dev.example.com
  endpoints: () => ({}), //later injected
  tagTypes: ["LIST", "DETAIL"]
});

export const addressApi = createApi({...}) // omitted, same as above with different url

Теперь, если я использую запрос на мутацию editTask из taskAPI. Необходимо обновить getTaskList, getTaskDetail с taskAPI. Используя invalidatesTags: ['LIST', 'DETAIL'], я могу автоматически получить изменения.

Однако при этом editTask API getWarehouseList от commonAPI также необходимо обновить, чтобы отразить некоторые изменения. Я больше не могу использовать теги, поскольку они не принадлежат одному и тому же createApi/reducerPath.

Вопрос в том, как мне обновить это getWarehouseList из commonAPI, когда editTask из taskAPI вносит изменения? Или единственный способ — выполнить unwrap().then() и просто вручную обновить эти данные?

🤔 А знаете ли вы, что...
JavaScript обеспечивает обработку ошибок с использованием конструкции try...catch.


1
88
1

Ответ:

Решено

Вы можете использовать утилиту фрагмента API validateTags , чтобы сделать недействительными любые конкретные теги, которые вам нравятся. Его можно использовать так: конечные точки мутации в commonApi могут сделать недействительными определенные теги в taskApi, и наоборот. Для этого я бы предложил использовать обработчик onQueryStarted конечной точки мутации.

Пример:

фрагмент TaskAPI

...
editTask: build.mutation({
  ...
  onQueryStarted: async(arg, { dispatch, queryFulfilled }) => {
    try {
      await queryFulfilled;
      dispatch(commonAPI.util.invalidateTags(
        ["SCHEME_LIST", "SCHEME_DETAIL"] // or whatever you specifically need
      ));
    } catch(error) {
      // handle/ignore/etc
    }
  },
}),
...

Как бы то ни было, использование unwrap().then() в коде пользовательского интерфейса также может сработать, хотя я все равно предлагаю вручную объявлять теги недействительными, а не выполнять их повторную выборку вручную. Что-то вроде следующего:

try {
  await editTaskTrigger().unwrap();
  dispatch(commonAPI.util.invalidateTags(["SCHEME_LIST", "SCHEME_DETAIL"]));
} catch(error) {
  ...
}

Интересные вопросы для изучения