Мое приложение должно получать данные с трех разных серверов, все они подключены к одной БД. Таким образом, я разделил код на 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.
Вы можете использовать утилиту фрагмента 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) {
...
}