如何从服务器返回特定值之前重新获取? (阵营-阿波罗)

时间:2018-01-20 01:32:57

标签: javascript graphql apollo react-apollo

使用React-Apollo,是否可以再次重新获取,直到获取的数据具有特定值?

假设我有一个持续ping服务器的组件,直到服务器回复某个响应。

graphql(gql`
  query {
    ping {
      response
    }
  }
`)(MyComponent)

服务器返回

ping: {
  response: "busy"
}

ping: {
  response: "OK"
}

我希望这个组件每隔一秒钟对服务器进行一次ping(轮询),直到响应为#34; OK"。用Apollo做最简单的方法是什么?

3 个答案:

答案 0 :(得分:2)

基本上您需要做的就是设置一个带有pollInterval选项的查询,当您收到所需的响应时,调用stopPolling函数到达data props 1}}功能。并确保将fetchPolicy设置为与轮询兼容的'network-only'

了解options.pollInterval here,关于options.fetchPolicy herethe structure of the data prop here

此代码适用于您:

const PingQuery = gql`
  query {
    ping {
      response
    }
  }
`

graphql(PingQuery, {
    options: {
        fetchPolicy: 'network-only', // we don't want to get the response from the cache
        pollInterval: 1000 // in milliseconds,      
    },
    props: ({data: {loading, ping, stopPolling}) => {
        if (loading) {
            return // still loading, ping is undefined
        }
        if (ping.response === 'busy') {
            // still busy
            return
        }       
        // not busy.. stop polling and do something
        stopPolling()
    }
})(MyComponent)

答案 1 :(得分:1)

我可能没有一个完美的答案,但我可能有一些东西指向正确的方向。

如您所知,graphql()高阶组件采用了第二个选项参数。您可以指定轮询间隔等内容以不断重复查询。

在本文中,他们解释了如何根据特定条件动态更改此轮询间隔。

https://dev-blog.apollodata.com/dynamic-graphql-polling-with-react-and-apollo-client-fb36e390d250

示例使用重构库,但我想你可以做类似这样的事情。



import { graphql } from "react-apollo";
import gql from "graphql-tag";
import { compose, withState, lifecycle } from "recompose";

const QUERY = gql`
  query {
    ping {
      response
    }
  }
`;

const withPing = compose(
  withState("polling", "setPolling", true),
  graphql(
    QUERY,
    {
      options: props => {
        if (props.polling === true) {
          return {
            pollInterval: 1000 // Repeat query every 1 second
          };
        } else {
          return { } // or return nothing
        }
      }
    }
  ),
  lifecycle({
    componentWillReceiveProps({
      data: { loading, ping },
      polling,
      setPolling
    }) {
      if (loading) {
        return;
      }

      if (ping.response === 'OK') {
        return setPolling(false) // Stops polling
      } else if (ping.response === 'busy') {
        return setPolling(true) // Continues polling
      }
    }
  })
);

const ComponentWithPing = withPing(Component);




我不知道这是否会有效,但应该很接近。

您可以签出的另一个途径是数据响应对象上的data.refetch()方法。

https://www.apollographql.com/docs/react/basics/queries.html#graphql-query-data-refetch

祝你好运!

您可以在此处了解有关这些选项的更多信息https://www.apollographql.com/docs/react/basics/queries.html#graphql-query-options,特别是此处的pollInterval https://www.apollographql.com/docs/react/basics/queries.html#graphql-config-options-pollInterval

答案 2 :(得分:0)

您可能要使用Subscriptions

带有钩子的示例:

useSubscription(
  gql`
    subscription {
      ping {
        response
      }
    }
  `
)

当然,useSubscription钩接受选项的第二个参数,因此您可以这样设置参数:

useSubscription(YOUR_SUBSCRIPTION, { variables: { foo: bar } })