Реагировать на SSR с N запросами после первоначального запроса - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь сделать то, в чем не должно быть необходимости. В идеале мне не нужно было бы выполнять вызовы 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 что-то вроде этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...