useLazyQuery не стреляет в Promise all - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь восстановить данные с сервера Apollo, но не могу заставить его работать. Я делаю два мутации и помещаю их в массив. Затем я хочу, когда они закончат, получить данные и заново заполнить график.

    Promise.all(promises)
    .then(result => {
      console.log(result)
      console.log(id)
      return getGraph({
        variables: {
          id: id
        },
        fetchPolicy: 'network-only'
      });
    })
    .catch();

Я вижу, что он записывает результат и правильный идентификатор. Также изменен только на сеть, поэтому он не будет выглядеть в кеше. Любые предложения о том, что может быть не так?

Br

1 Ответ

1 голос
/ 08 октября 2019

Я полагаю, getGraph - это fetcher - обратный вызов, возвращаемый useLazyQuery.

К сожалению, он не возвращает Promise, но возвращает void (согласно Apollo docs ). * В Github существует существующая проблема , но я не уверен, будет ли это когда-либо реализовано.

Смотрите, для хуков гораздо более естественно возвращать некоторые данные при каждом рендеринге. На одном рендере у вас есть флаг isLoading = true, а на следующем вы получаете isLoading = false и несколько непустых data. Если вы введете Promise, который может быть разрешен или отклонен независимо от цикла рендеринга компонента, все становится очень грязным.

Если вам не нравится этот подход (или вам действительно нужно синхронизировать какой-либо запрос с другим) в качестве обходного пути, вы можете запустить query на client, доступ к которому осуществляется через ApolloConsumer.

[UPD] Как писал @Jedi Schmedi в комментариях, fetcher фактически возвращает Promise, но в более поздней версии (^3.1.2) apollo. Так что это может быть обходной путь, хотя я не уверен, что этот API нестабилен и может быть изменен ИЛИ документы вводят в заблуждение.

...