Reactjs Graphql订阅还是轮询间隔?不同情况下的差异?

Reactjs Graphql订阅还是轮询间隔?不同情况下的差异?,reactjs,graphql,Reactjs,Graphql,我目前正在观看一个使用MERNG stack的课程,它基本上是一个可以发布内容的应用程序,我自己试图实现的一个目标是实时向所有用户发送帖子,所以,我的第一个想法是,好吧,让我们使用graphql订阅,在react使用apollo/client时,我编写了这段代码以实时获取新帖子 import React, { useContext } from "react"; import { useQuery, useSubscription, gql } from "@apo

我目前正在观看一个使用MERNG stack的课程,它基本上是一个可以发布内容的应用程序,我自己试图实现的一个目标是实时向所有用户发送帖子,所以,我的第一个想法是,好吧,让我们使用graphql订阅,在react使用apollo/client时,我编写了这段代码以实时获取新帖子

import React, { useContext } from "react";
import { useQuery, useSubscription, gql } from "@apollo/client";
import { Grid } from "semantic-ui-react";

import { AuthContext } from "../context/auth";
import PostCard from "../components/PostCard";
import PostForm from "../components/PostForm";

import { FETCH_POSTS_QUERY } from "../util/graphql";

const Home = () => {
  const { user } = useContext(AuthContext);

  const { loading, data: { getPosts: posts } = {} } = useQuery(
    FETCH_POSTS_QUERY,
    // {
    //   pollInterval: 500
    // }
  );

  const { data: { newPost: post } = {} } = useSubscription(POSTS_REAL_TIME);

  return (
    <Grid columns={3}>
      <Grid.Row className="page-title">
        <Grid.Column>
          <h1>Recent Posts</h1>
        </Grid.Column>
      </Grid.Row>
      <Grid.Row>
        {user && (
          <Grid.Column>
            <PostForm />
          </Grid.Column>
        )}
        {loading ? (
          <h1>Loading Posts...</h1>
        ) : (
          posts &&
          posts.map(post => {
            return (
              <Grid.Column key={post.id} style={{ marginBottom: "20px" }}>
                <PostCard post={post} />
              </Grid.Column>
            );
          })
        )}
      </Grid.Row>
    </Grid>
  );
};

const POSTS_REAL_TIME = gql`
  subscription {
    newPost {
      id
      body
      createdAt
      username
      likes {
        username
      }
      likeCount
      comments {
        id
        username
        createdAt
      }
      commentCount
    }
  }
`;

export default Home;
这就意味着,我花了2个小时来尝试一个奇怪的代码,而只有一行代码我就可以做到这一点,那么,pollInterval会取代订阅吗?我应该如何使用订阅?如果我使用pollInterval让每个人都保持最新,这对性能或其他方面有害吗


谢谢你抽出时间来陪我

我不是专家,但我认为轮询不是实现这一点的正确方法,因为您将不断尝试刷新数据,这将浪费服务器的资源。我会使用订阅(,)或类似的东西,两者都使用websockets,所以不会有太大区别。

我想问题不是你的订阅不起作用,而是你想在视图中保留旧数据,然后新帖子就会出现。您需要做的是将旧数据保持在React状态或使用apollo状态/缓存。因此,您不必使用新帖子更新视图,而是使用最新帖子更新状态,从而强制重新加载组件。

推送与拉送。探望奶奶时,孩子每隔几分钟就会问“我们到了吗?”。订阅是指孩子在到达目的地的整个过程中都在小睡,然后被叫醒。它们都有优点和缺点,适合不同的用例。持续更新受益于订阅。如果你只每隔几个小时更新一次,那么打开一个websocket是一种浪费。酷酷的朋友,谢谢你的回答,所以我想如果我使用pollInterval,就可以做我想做的事情了!是的,我的意思是,pollInterval基本上做的是调用useQuery eve 500milisSeconds,以了解是否有已知的更新内容,这正是我所想的,但是,您使用的是graphql,您可以使用订阅,因为它使用web套接字,所以没有理由使用socket.io,但我不知道如何将订阅的新对象添加到当前数据中:/
const { loading, data: { getPosts: posts } = {} } = useQuery(
    FETCH_POSTS_QUERY,
    {
      pollInterval: 500
    }
  );