使用react-apollo和异步提取的变量调用graphql查询

时间:2017-03-23 11:50:10

标签: javascript reactjs asynchronous geolocation react-apollo

我有一个react组件,可以显示您附近有兴趣点的地图。

我的HOC使用react-apollo来查询这些兴趣点,并将数据作为纯UI组件的道具。

我正在尝试将用户的位置从navigator.geolocation放入我的graphql查询的变量中。但由于导航器API是异步的,我似乎无法使其工作。

它看起来像这样:

const getCurrentPosition = async (settings = {}) =>
  new Promise((resolve, reject) => {
    navigator.geolocation.getCurrentPosition(resolve, reject, settings);
  }
);

const query = gql`
  query($coordinates: [[Float]]){
    whatever(filter: {coordinates: $coordinates}) {
      _id
      coordinates
    }
  }
`;

const withData = graphql(query, {
  options: async (props) => {
    const position = await getCurrentPosition();

    return {
      variables: {
        coordinates: [position.coords.latitude, position.coords.longitude],
      },
    };
  },
  props: ({ data: { loading, whatever, refetch, variables: { coordinates } } }) => ({
    loading,
    whatever,
    coordinates,
    refetch,
  }),
});


const List = ({ loading, whatever, coordinates, refetch }) => {
  if (loading) {
    return null;
  }
  return (/* map display*/);
};

List.propTypes = {
  loading: React.PropTypes.bool.isRequired,
  whatever: React.PropTypes.array,
  coordinates: React.PropTypes.array,
  refetch: React.PropTypes.func,
};

export default withData(Map);

coordinates在我的组件中总是null

当我记录事物时,似乎计算了位置,但是graphql查询和组件渲染在它之前发生。

当我们获取用户位置时,不会调用查询并且不会重新呈现组件。

有可能吗?我做错了吗?

1 个答案:

答案 0 :(得分:2)

我会预先进行异步调用并通过props注入它,然后使用http://dev.apollodata.com/react/api.html#graphql-config.skip跳过查询,如果该位置还没有在这里。

也许使用recompose / withProps等?