onCompleted 处理程序未使用 Apollo 客户端查询触发

Posted

技术标签:

【中文标题】onCompleted 处理程序未使用 Apollo 客户端查询触发【英文标题】:onCompleted handler not firing with Apollo Client Query 【发布时间】:2019-01-27 23:25:52 【问题描述】:

我在执行 Apollo 客户端查询时无法触发 onCompleted 回调。

查询运行没有问题,它返回我期望的结果,但 onCompleted 处理程序永远不会触发。我尝试了多种方法:

a) 我尝试使用 HOC 代替 React 组件(请参阅 在要点末尾发表评论) b) 我已尝试使缓存无效并将 fetchPolicy 设置为“仅限网络” 我已尝试将处理程序设置为“异步”

有一个与我遇到的问题相关的 Github 开放问题,但是该线程中的人仅在从缓存加载时遇到问题。我遇到回调没有触发一直。https://github.com/apollographql/react-apollo/issues/2177

这是我的代码的修剪示例:

import React from 'react';
import  graphql, Query  from 'react-apollo';
import  ProductQuery  from '../../graphql/Products.graphql';

class EditProductVisualsPage extends React.Component 
  constructor() 
    super();
  

  render() 
    const  productId  = this.props;
    return (
      <Query
        query=ProductQuery 
        variables= id: productId 
        onCompleted=data => console.log("Hi World")>
        ( loading, data:  product  ) => (
          /* ... */ 
        )
      </Query>
    );
  


export default EditProductVisualsPage;

/*
export default graphql(ProductQuery, 
  options: props => (
    variables: 
      id: props.productId,
    ,
    fetchPolicy: "cache-and-network",
    onCompleted: function() 
      debugger;
    ,
  ),
)(EditProductVisualsPage);
*/

在这一点上,我完全被难住了。任何帮助将不胜感激。

库版本

react-apollo (2.1.4) apollo 客户端 (2.3.1) 反应(16.3.32)

【问题讨论】:

你找到解决方案了吗? 没有真正的解决方案,只有我在这里列出的解决方法:github.com/apollographql/react-apollo/issues/… 【参考方案1】:

另一种解决方案,这对我有用。 onCompleted 坏了,但是你需要在 X 完成后调用一个函数。只需使用好旧的 .then(),这是任何前端新手的示例。

    fireFunction().then(() => 
       console.log('fired')
    );

【讨论】:

【参考方案2】:

(由于这个问题已经收到了大量的意见,所以回答这个问题)。

截至 2019 年 4 月,onCompleted 处理程序仍处于损坏状态。但是,可以通过使用 withApollo HOC 来解决它。 https://www.apollographql.com/docs/react/api/react-apollo#withApollo

这是一个示例集成:

import React from 'react';
import  withApollo  from 'react-apollo';

class Page extends React.Component 
  constructor(props) 
    super();
    this.state = 
      loading: true,
      data: ,
    ;
    this.fetchData(props);
  

  async fetchData(props) 
    const  client  = props;
    const result = await client.query(
      query: YOUR_QUERY_HERE, /* other options, e.g. variables:  */     
    );

    this.setState(
      data: result.data,
      loading: false,
    );
  

  render() 
    const  data, loading  = this.state;
    /* 
      ... manipulate data and loading from state in here ...
    */
  

export default withApollo(Page);

【讨论】:

以上是关于onCompleted 处理程序未使用 Apollo 客户端查询触发的主要内容,如果未能解决你的问题,请参考以下文章

从 p:remoteCommand 的 oncomplete 处理程序调用 JavaScript 函数 - 使用一些 JavaScript 代码模拟相同的函数

按Enter键后,JLine自动完成功能未显示并运行onComplete

onComplete 回调可以与 localhost 一起使用吗?

.then()方法的意思和用法

Apache Camel中的OnCompletion用于整个文件的完成

显示对话框 onCompleted 无法按预期工作