【问题标题】:useLazyQuery not firing in Promise alluseLazyQuery 未在 Promise all 中触发
【发布时间】:2020-02-04 11:52:32
【问题描述】:

我正在尝试从 apollo 服务器重新获取数据,但无法使其正常工作。 我做了两个突变并将它们推入一个数组。 然后我想,当他们完成时,获取数据并重新填充图表。

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

我可以看到它记录了结果和正确的 ID。也更改为仅网络,因此它不会在缓存中查找。 有什么可能出错的建议吗?

Br

【问题讨论】:

  • 您的问题没有意义,我认为部分原因是您实际上没有向我们展示调用useLazyQuery的代码
  • getGraph 是 fetcher 函数,抱歉。但它解决了没有。

标签: reactjs react-hooks react-apollo apollo-client


【解决方案1】:

我假设 getGraph 是 fetcher - useLazyQuery 返回的回调。

不幸的是,它没有返回Promise,而是返回void(根据Apollo docs)。 Github 上有existing issue,但我不确定是否会实现。

看,对于钩子来说,在每次渲染时返回一些数据要自然得多。在一次渲染中,您有一些标志isLoading = true,下一次渲染您将获得isLoading = false 和一些非空data。如果您引入Promise,无论组件的渲染周期如何,都可以解决或拒绝,事情变得非常混乱。

如果您不喜欢这种方法(或者确实需要将某些查询与另一个查询同步)作为一种解决方法,您可以在通过ApolloConsumer 访问的client 上运行query

[UPD] 正如@Jedi Schmedi 在 cmets 中所写,fetcher 实际上返回Promise,但在apollo 的更新版本(^3.1.2)中。因此,尽管我不确定该 API 是否不稳定并且可以更改或者文档是否具有误导性,但它可能是一种解决方法。

【讨论】:

  • 抱歉,忽略了 getGraph 是 fetcher。我更新了版本,现在它可以工作了。所以也许他们修复了一个错误的行为。
  • 哇,真是个惊喜!他们的文档明确表示它什么也不返回!
  • "@apollo/react-hooks": "^3.1.2", 有 3.0.0
  • 我试过 "@apollo/react-hooks": "^3.1.3" 但在 useLazyQuery 中没有得到任何承诺
猜你喜欢
  • 2021-06-13
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多