Я пытаюсь сделать то, в чем не должно быть необходимости. В идеале мне не нужно было бы выполнять вызовы REST после вызовов GraphQL, но это то, что есть. Всякий раз, когда я беру что-то для объекта, он объединяет упомянутых людей в массив, и мне нужна информация о другом API, которую можно дополнить для КАЖДОГО человека. Теперь я читал о опции пропуска, и это, вероятно, было бы хорошо, но мне, поскольку мне нужно знать, сколько «крючков» для вызова, а я явно не знаю, я немного застрял в этом. Наивно, я сделал ловушку, но она не работает, так как она передает useEffect
, который не работает с SSR.
function useExtraQuery(loading, data, query) {
const [pending, setPending] = useState(!!query);
const [value, setValue] = useState(null);
const [error, setError] = useState(null);
const client = useApolloClient();
const execute = useCallback(() => query(client, data)
.then(response => setValue(response))
.catch(e => setError(e))
.finally(() => setPending(false)), [query]);
useEffect(() => {
if (pending && !loading) {
execute();
}
}, [loading, execute]);
return { pending, value, error };
}
Моя идея заключалась в следующем:
const { loading, error, data } = useQuery(query, getParams(params));
const extraQuery = useExtraQuery(loading, data, getAdditionalData);
if (loading || extraQuery.pending) {
return null;
}
Итак, как только загрузка данных завершается, выполняется другой, и он должен просто вернуть Promise.all, который, когда он будет выполнен, позволит выполнить рендеринг. Помимо изменения сервера и прочего, как я могу сделать sh что-то вроде этого?