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