Caching 轮询不工作时更新Apollo客户端3的缓存

Caching 轮询不工作时更新Apollo客户端3的缓存,caching,graphql,apollo-client,polling,Caching,Graphql,Apollo Client,Polling,我正在玩@apollo/clientv3的缓存。这是我的建议 我正在使用client.writeQuery向缓存的用户列表添加一个用户,并且查询每隔几秒钟就有一个轮询间隔 我可以将用户添加到列表中,它确实刷新了UI,并且我可以在Chrome的网络选项卡中看到pollInterval工作 问题 当轮询开始时,我希望用户列表返回到其初始状态,并覆盖我手动添加到缓存中的用户,但事实并非如此 阿波罗形态 export const cache=new InMemoryCache(); const客户端=新

我正在玩
@apollo/client
v3的缓存。这是我的建议

我正在使用
client.writeQuery
向缓存的用户列表添加一个用户,并且查询每隔几秒钟就有一个
轮询间隔

我可以将用户添加到列表中,它确实刷新了UI,并且我可以在Chrome的
网络
选项卡中看到pollInterval工作

问题

当轮询开始时,我希望用户列表返回到其初始状态,并覆盖我手动添加到缓存中的用户,但事实并非如此

阿波罗形态

export const cache=new InMemoryCache();
const客户端=新客户端({
隐藏物
链接:新的HttpLink({
uri:“https://fakeql.com/graphql/218375d695835e0850a14a3c505a6447"
})
});
用户列表

export const UserList=()=>{
const{optimisticAddUserToCache,data,load}=useUserList();
如果(装载){
返回装载。。。;
}
返回(
optimisticAddUserToCache()}>将用户添加到缓存
{data?.users.map(user=>{
返回
  • {user.firstname}
  • ; })} ); }
    useUserList

    const GET\u USER\u LIST=gql`
    查询用户{
    使用者{
    身份证件
    名字
    }
    }
    `;
    导出常量useUserList=()=>{
    const{loading,error,data,refetch}=useQuery(获取用户列表{
    pollInterval:4000//它确实进行轮询(检查chromes的网络选项卡),但它似乎没有覆盖缓存
    });
    const client=useAppolloClient();
    const optimisticAddUserToCache=()=>{
    const newUser:any={
    id:`userId-${Math.random()}`,
    名字:“约翰·多伊”,
    __typename:“用户”
    };
    const currentUserList=client.readQuery({query:GET\u USER\u LIST});
    //这是可行的,它确实添加了一个用户,并且UI刷新。
    client.writequiry({
    查询:获取用户列表,
    数据:{
    用户:[newUser,…currentUserList]
    }
    });
    };
    返回{optimisticAddUserToCache,loading,error,data,refetch};
    };
    
    按预期工作(几乎)

    轮询的响应总是带有相同的数据

    不会导致写入缓存(未比较内容)

    。。。缓存中没有数据更改

    <代码>数据属性(来自
    useQuery
    )未更新

    。。。无
    数据更新,无组件重新招标


    要使乐观更新生效,您需要在远程数据源上进行真正的变异,真正的[持久化]更改。。。已传播到下一个轮询响应。

    按预期工作(几乎)

    轮询的响应总是带有相同的数据

    不会导致写入缓存(未比较内容)

    。。。缓存中没有数据更改

    <代码>数据
    属性(来自
    useQuery
    )未更新

    。。。无
    数据更新,无组件重新招标


    要使乐观更新生效,您需要在远程数据源上进行真正的变异,真正的[持久化]更改。。。传播到下一个轮询响应。

    这是我正在开发的大型应用程序的简短版本。在这个应用程序中,我也在做同样的事情,有时候它也能工作,其他时候不行。我不知道为什么。但我可以告诉你,我从未对数据使用过变异。为什么“…不会导致写入缓存(未比较内容)…”?轮询数据实际上与缓存中的数据不同,因此应该进行比较?我很确定有一种解决方案不使用变异,正如我所说的,我不使用变异,它在我的应用程序中间歇工作。轮询数据等于先前轮询的数据。。。响应数据未与缓存项进行比较。。。也许应该比较一下(在github上发布一个问题?)。。。突变的外部来源?为什么不使用订阅(而不是轮询)?为了以防万一,我也在github上发布了文章。我只使用GraphQL读取数据,而不是写入数据,因此我根本不使用突变。我们也有订阅,但在这种特殊情况下,我真的想了解缓存是如何工作的,所以除非我这样做是完全不可能的(我不这么认为,正如我所说,我有一半在我的主应用程序上工作),我真的很想让我的例子发挥作用。看起来与此相关的是我正在开发的一个大型应用程序的一个简短版本。在这个应用程序中,我也在做同样的事情,有时候它也能工作,其他时候不行。我不知道为什么。但我可以告诉你,我从未对数据使用过变异。为什么“…不会导致写入缓存(未比较内容)…”?轮询数据实际上与缓存中的数据不同,因此应该进行比较?我很确定有一种解决方案不使用变异,正如我所说的,我不使用变异,它在我的应用程序中间歇工作。轮询数据等于先前轮询的数据。。。响应数据未与缓存项进行比较。。。也许应该比较一下(在github上发布一个问题?)。。。突变的外部来源?为什么不使用订阅(而不是轮询)?为了以防万一,我也在github上发布了文章。我只使用GraphQL读取数据,而不是写入数据,因此我根本不使用突变。我们也有订阅,但在这种特殊情况下,我真的想了解缓存是如何工作的,因此,除非我的方式完全不可能(我不这么认为,正如我所说,我有一半在我的主应用程序上工作),否则我真的很想让我的示例发挥作用。看起来与