Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Apollo GraphQL更新到类型策略_Javascript_Typescript_Graphql_Apollo_Typepolicies - Fatal编程技术网

Javascript Apollo GraphQL更新到类型策略

Javascript Apollo GraphQL更新到类型策略,javascript,typescript,graphql,apollo,typepolicies,Javascript,Typescript,Graphql,Apollo,Typepolicies,我的头撞在墙上。我已经更新到Apollo 3,无法理解如何将updateQuery迁移到typePolicy。我正在进行基本的基于延续的分页,这就是我用来合并fetchMore结果的方式: await fetchMore({ query: MessagesByThreadIDQuery, variables: { threadId: threadId, limit: Configuration.MessagePageSize, continuation: toke

我的头撞在墙上。我已经更新到Apollo 3,无法理解如何将
updateQuery
迁移到
typePolicy
。我正在进行基本的基于延续的分页,这就是我用来合并
fetchMore
结果的方式:

await fetchMore({
  query: MessagesByThreadIDQuery,
  variables: {
    threadId: threadId,
    limit: Configuration.MessagePageSize,
    continuation: token
  },
  updateQuery: (prev, curr) => {
    // Extract our updated message page.
    const last = prev.messagesByThreadId.messages ?? []
    const next = curr.fetchMoreResult?.messagesByThreadId.messages ?? []

    return {
      messagesByThreadId: {
        __typename: 'MessagesContinuation',
        messages: [...last, ...next],
        continuation: curr.fetchMoreResult?.messagesByThreadId.continuation
      }
    }
  }
我曾尝试自己编写
合并
类型策略
,但它只是不断加载阿波罗缓存中的重复标识符并抛出错误。以下是我的
typePolicy
查询的外观

  typePolicies: {
    Query: {
      fields: {
        messagesByThreadId: {
          keyArgs: false,
          merge: (existing, incoming, args): IMessagesContinuation => {
            const typedExisting: IMessagesContinuation | undefined = existing
            const typedIncoming: IMessagesContinuation | undefined = incoming
            const existingMessages = (typedExisting?.messages ?? [])
            const incomingMessages = (typedIncoming?.messages ?? [])

            const result = existing ? {
              __typename: 'MessageContinuation',
              messages: [...existingMessages, ...incomingMessages],
              continuation: typedIncoming?.continuation
            } : incoming


            return result
          }
        }
      }
    }
  }

所以我能够解决我的用例。这似乎比实际需要困难得多。我基本上必须尝试定位与传入项匹配的现有项并覆盖它们,以及添加缓存中尚不存在的任何新项

我还必须仅在提供了延续令牌的情况下应用此逻辑,因为如果它为null或未定义,我应该只使用传入值,因为这表明我们正在进行初始加载

我的文档形状如下:

{
“项”:[{id:string,…others}],
“continuation”:“一些令牌值”
}
我创建了一个通用类型策略,可以用于所有形状相似的文档。它允许我指定items属性的名称、要缓存的键参数以及graphql类型的名称

导出函数ContinuationPolicy(keyArgs:Array,itemPropertyKey:string,typeName:string){ 返回{ keyArgs, 合并(现有:任意、传入:任意、参数:任意){ if(!!existing&&!!args.args?.continuation){ const existingItems=(现有?现有[itemPropertyKey]:[]) 常量incomingItems=(传入?传入[itemPropertyKey]:[]) let items:Array=[…existingItems] for(设i=0;im.\uu ref===current.\uu ref) 如果(发现>-1){ 项目[已找到]==当前 }否则{ 项目=[…项目,当前] } } //这个新数据是上一个数据的延续。 返回{ __typename:typename, [itemPropertyKey]:项目, continuation:incoming.continuation } }否则{ //当缓存中没有现有数据时,我们只使用传入的数据。 返回传入 } } } }
因此我能够解决我的用例。这似乎比实际需要困难得多。我基本上必须尝试定位与传入项匹配的现有项并覆盖它们,以及添加缓存中尚不存在的任何新项

我还必须仅在提供了延续令牌的情况下应用此逻辑,因为如果它为null或未定义,我应该只使用传入值,因为这表明我们正在进行初始加载

我的文档形状如下:

{
“项”:[{id:string,…others}],
“continuation”:“一些令牌值”
}
我创建了一个通用类型策略,可以用于所有形状相似的文档。它允许我指定items属性的名称、要缓存的键参数以及graphql类型的名称

导出函数ContinuationPolicy(keyArgs:Array,itemPropertyKey:string,typeName:string){ 返回{ keyArgs, 合并(现有:任意、传入:任意、参数:任意){ if(!!existing&&!!args.args?.continuation){ const existingItems=(现有?现有[itemPropertyKey]:[]) 常量incomingItems=(传入?传入[itemPropertyKey]:[]) let items:Array=[…existingItems] for(设i=0;im.\uu ref===current.\uu ref) 如果(发现>-1){ 项目[已找到]==当前 }否则{ 项目=[…项目,当前] } } //这个新数据是上一个数据的延续。 返回{ __typename:typename, [itemPropertyKey]:项目, continuation:incoming.continuation } }否则{ //当缓存中没有现有数据时,我们只使用传入的数据。 返回传入 } } } }