javascript - @urql/svelte,如果不在 onMount 中,则为 "Function called outside component initialization"

标签 javascript svelte svelte-3 svelte-component urql

我正在尝试 https://github.com/FormidableLabs/urql/tree/master/packages/svelte-urql 所做的惊人作品伙计们。

直到今天的问题,一切都很好。

我正在使用下面的代码,它给了我这个错误:

Error: Function called outside component initialization
  at get_current_component (index.mjs:615)
  at getContext (index.mjs:648)
  at getClient (urql-svelte.mjs:55)
  at query (urql-svelte.mjs:81)
  at Players.svelte:41

代码:
<script>
  import { query } from '@urql/svelte'
  import { myQuery } from './myQuery'

  let players
  let myVars

  function sleep (ms) {
    return new Promise((resolve) => setTimeout(resolve, ms))
  }

  $: (async () => {
    await sleep(2000) // this gives me the error; removing it make it work
    players = query({
      query: myQuery,
      variables: { ...myVars },
      requestPolicy: 'cache-and-network'
    })
  })()
</script>

{#if !players}
  Loading players...
{:else}
  Players loaded! Do the work.
{/if}

你能提出什么问题吗?

如果我使用 await()onMount()有用!像这样:

onMount(async () => {
  await sleep(2000)
  loaded = true
})

这里是 @urql/svelte 的代码:
  • 查询.ts:https://github.com/FormidableLabs/urql/blob/master/packages/svelte-urql/src/operations/query.ts
  • 上下文.ts:https://github.com/FormidableLabs/urql/blob/master/packages/svelte-urql/src/context.ts

  • 也许 context代码?
    import { setContext, getContext } from 'svelte';
    import { Client, ClientOptions } from '@urql/core';
    
    const CLIENT = '$$_URQL';
    
    export const getClient = (): Client => getContext(CLIENT);
    
    export const setClient = (client: Client): void => {
      setContext(CLIENT, client);
    };
    
    export const initClient = (args: ClientOptions): Client => {
      const client = new Client(args);
      setClient(client);
      return client;
    };
    

    如果您需要,我可以在 CodeSandbox 上创建一个 REPL,没问题。
    @urql/svelte 上的错误: https://github.com/FormidableLabs/urql/issues/795.

    关于您的 Svelte 项目的信息:
    - Chrome 83
    - slim 版:3.23.0
    - 卷起

    最佳答案

    如果使用 Vite 作为捆绑器,则需要排除 @urql/svelte从依赖预捆绑,这显然对我造成了这个错误。
    将此添加到您的 Vite 配置中:

    {
      optimizeDeps: {
        exclude: ['@urql/svelte']
      }
    }
    
    这也适用于 svelte-apollo , 做同样的事情但是替换包名!
    Vite 文档 dependency pre-bundling在那里,如果好奇的话。

    关于javascript - @urql/svelte,如果不在 onMount 中,则为 "Function called outside component initialization",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62101637/

    相关文章:

    svelte - 如何验证传递的 prop 是否是 Svelte 中的组件类型?

    javascript - 切换 :active class with ReactJS

    javascript - 在 Svelte 组件中有没有一种方便的方法来引用 DOM 元素?

    flask - 带有 Flask 后端的 Svelte(kit) - 一些问题

    svelte - 从距 IP 最近到最远的距离对数组进行排序

    javascript - 从文件 ://with no sever 运行 Svelte 应用程序

    javascript - Js, Bootstrap : Do action each time while opening tab

    javascript - 如何附加包含 md-checkbox 和 md-icon 的 html 标签?

    javascript - 动画 SVG 图形条的高度

    javascript - 我应该如何在 Svelte 和 Sapper 中使用 cookie?