迭代异步函数导致苗条

p13*_*rnd 2 svelte

我正在尝试迭代某个异步函数返回的某个值。

import { onMount } from 'svelte';

let navigation;

onMount(async function(){
    navigation = FETCHER.data.navigation;
    console.log(navigation);
});
Run Code Online (Sandbox Code Playgroud)

然后在 html

{#await navigation}
    {#each navigation.main as menuItem}
        foobar
    {/each}
{/await}
Run Code Online (Sandbox Code Playgroud)

然而“foobar”从未出现。

在导航中,我找到了这个数据结构:

main: (3) […]
0: Object { ID: 16, url: "http://127.0.0.1/", title: "Welcome", … }
1: Object { ID: 15, url: "http://127.0.0.1/", title: "Home", … }
2: Object { ID: 176, url: "http://127.0.0.1/test/", title: "test", … }
length: 3
Run Code Online (Sandbox Code Playgroud)

我真的很好奇为什么 await 块内的任何东西都没有呈现。我的承诺有问题吗?

旁注中的一件事可能很重要:FETCHER.data.navigation 变量是使用 wp_localize_script 从 WordPress 传递的,因此没有任何 fetch 调用。

感谢您提前提供任何意见。

最好的,塞博

Fél*_*ier 5

await需要then 块的正确语法:

{#await navigation}
    <p>awaiting...</p>
{:then navigation}
    {#each navigation.main as menuItem}
        foobar
    {/each}
{:catch error}
    <p>error</p>
{/await}
Run Code Online (Sandbox Code Playgroud)

然而,这取决于承诺正确解析的事实,并且在异步函数的情况下,需要返回值。在这里的代码中,异步函数没有返回任何内容,这将无法正确解析。

因此,纠正 await 块语法并从承诺中返回一个值,以下应该有效:

<script>
    import { onMount } from 'svelte';
    let promise;
    async function fetchStuff() {
        return FETCHER.data.navigation;
    }
    onMount(() => {
        promise = fetchStuff();
    });
</script>

{#await promise}
<p>
    awaiting...
</p>
{:then navigation}
<p>
    here access navigation
</p>
{:catch error}
<p>
    oh noes.
</p>
{/await}
Run Code Online (Sandbox Code Playgroud)