我正在尝试迭代一些异步函数返回的值。
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
答案 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}