@urql/svelte,“在组件初始化之外调用的函数”如果不在 onMount 中
Posted
技术标签:
【中文标题】@urql/svelte,“在组件初始化之外调用的函数”如果不在 onMount 中【英文标题】:@urql/svelte, "Function called outside component initialization" if not in onMount 【发布时间】:2020-09-17 22:45:57 【问题描述】:我正在尝试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
您能提出什么问题吗?
如果我在onMount()
中使用await()
,它可以工作!像这样:
onMount(async () =>
await sleep(2000)
loaded = true
)
这里是@urql/svelte
的代码:
-
query.ts:https://github.com/FormidableLabs/urql/blob/master/packages/svelte-urql/src/operations/query.ts
context.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 项目的信息: - 铬 83 - 苗条版:3.23.0 - 汇总
【问题讨论】:
似乎这些反应式语句不喜欢异步函数。你的逻辑需要它吗?为什么不使用其他问题中的 await 块:***.com/questions/62087073/… 【参考方案1】:如果使用 Vite 作为捆绑器,您需要将 @urql/svelte
从依赖项预捆绑中排除,这显然对我造成了此错误。
将此添加到您的 Vite 配置中:
optimizeDeps:
exclude: ['@urql/svelte']
这也适用于svelte-apollo
,做同样的事情,但替换包名!
Vite 的 dependency pre-bundling 上的文档在那里,如果好奇的话。
【讨论】:
【参考方案2】:我的情况有点不同,但得到了同样的错误。就我而言,我试图让 Svelte/Sapper 在 Docker 容器中运行以用于开发目的。在此之前我一直在摆弄package.json
,在某个时候我决定将svelte
和sapper
移到“依赖项”而不是“devDependencies”。
"dependencies":
// ...
"sapper": "^0.27.0",
"svelte": "^3.0.0"
这是个坏主意。一旦我把它移回“devDependencies”,错误就消失了,一切都按预期工作了。
"devDependencies":
// ...
"sapper": "^0.27.0",
"svelte": "^3.0.0"
我希望这可以帮助某人。
【讨论】:
我从来没有猜到这可能是问题所在,但它肯定是我的问题。谢谢!我认为正在发生的事情是,由于 svelte 的全部内容不是向客户端发送框架代码,它的所有内容都需要在 devDependencies 中。就我而言,是苗条的阿波罗在错误的地方。以上是关于@urql/svelte,“在组件初始化之外调用的函数”如果不在 onMount 中的主要内容,如果未能解决你的问题,请参考以下文章