遍历异步函数导致苗条

时间:2019-11-18 22:15:01

标签: svelte

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

import { onMount } from 'svelte';

let navigation;

onMount(async function(){
    navigation = FETCHER.data.navigation;
    console.log(navigation);
});

然后用html

{#await navigation}
    {#each navigation.main as menuItem}
        foobar
    {/each}
{/await}

但是,“ 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

我真的很好奇,为什么await块中的任何内容都没有呈现。我对诺言有错吗?

旁注中可能很重要的一件事:FETCHER.data.navigation变量是使用wp_localize_script从WordPress传递的,因此无论如何都不会进行调用。

感谢您的任何预先输入。

最好, Sebo

1 个答案:

答案 0 :(得分:2)

await的正确语法需要then block

{#await navigation}
    <p>awaiting...</p>
{:then navigation}
    {#each navigation.main as menuItem}
        foobar
    {/each}
{:catch error}
    <p>error</p>
{/await}

但是,这取决于promise正确解析的事实,并且在异步功能的情况下,需要返回值。在此处的代码中,异步函数未返回任何内容,该函数将无法正确解析。

因此,更正await块语法并从promise中返回一个值,以下方法应该起作用:

<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}