[英]Svelte 3, async onMount or a valid alternative?
我需要的是在 Svelte onMount()
中使用async-await
。
或者,也许您可以建议我哪里出了问题以及我可以替代使用什么。
重现
"Mounting..."
和"A lot of background work..."
为什么?
onMount()
是否识别async
function promise? 应该是?
我需要这种async
行为,因为在渲染Child
组件之前我需要等待function lazyLoading()
。
在 Svelte 中是否有其他方法可以做到这一点?
只是为了解释为什么onMount
不能是async
function(这可能会在未来改变,但不要指望它会):
您可以从销毁组件时调用的onMount
处理程序返回 function。 但是async
函数只能返回 promise 。 由于 promise 不是 function,Svelte 将忽略返回值。
这与 React 中的useEffect
相同,顺便说一句 - function 必须同步以避免竞争条件。 onMount 的推荐解决方案与onMount
相同——在处理程序中放置一个async
useEffect
:
onMount(() => {
async function foo() {
bar = await baz();
}
foo();
return () => console.log('destroyed');
});
(请注意,您有责任处理由于组件在 promise 解析之前被销毁而引起的任何竞争条件,尽管在已销毁的组件内分配 state 是无害的。)
我已经打开一个问题来讨论在这些情况下提供更有用的反馈: https://github.com/sveltejs/svelte/issues/4944
onMount
必须是同步的。 但是,您可以在标记中使用{#await}
块并使lazyLoading
async
,例如:
{#await lazyLoading() then data}
I'm the child and I loaded "{data}".
{/await}
你也可以做...
<script>
let dataPromise = lazyLoading()
</script>
{#await dataPromise then data}
I'm the child and I loaded "{data}".
{/await}
请在此处查看我的工作示例。
这样做的额外好处是允许您使用加载程序以及在 promise 被拒绝时出现的标记,使用以下语法:
{#await promise}
loading
{:then value}
loaded {value}
{:catch error}
failed with {error}
{/await}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.