使用Svelte組件存取非同步函數的回傳值
P粉463824410
2023-08-16 00:11:05
<p>我有以下的程式碼片段( layout.svelte):</p>
<pre class="brush:js;toolbar:false;">import { getLang } 從 "$lib/locale";
import { browser } from "$app/environment";
const loadLang = async () => {
if (browser) {
// return await getLang(document.documentElement.lang, "home").then( function (data: any) {
// const nav = JSON.stringify(data.nav);
// console.log(nav)
// return nav;
// });
const initLocale= await getLang(document.documentElement.lang, "home");
return initLocale.json();
}
};
const a = loadLang();
console.log(a);
</pre>
<p>這段程式碼的功能是偵測瀏覽器語言和請求的路由,然後搜尋與語言和頁面對應的正確的JSON檔案。但是有一個問題,我無法訪問異步<code>loadLang()</code>的語言數據,以便在組件的HTML元素中使用它,除了這裡提到的許多答案(這不是我要找的) ,我想要的是一種存取上述函數的返回值並在HTML元素中使用它的方法? </p>
在標記中,有原生語法(有很多變體)可以用來等待承諾:
另一種選擇是在頂層範圍聲明一個變量,並在資料載入後設定它。當然,它首先會是未定義的,或者是您初始化的其他任何值。然後通常會與
{#if}
結合使用:在
browser
上有一個守衛並不好。您可能希望將資料載入移到layout
載入函數中,以便將其作為data
屬性傳遞,並且可以在SSR和CSR期間使用,並且對使用佈局的每個頁面都可使用。不要使用
document.documentElement.lang
,而是在伺服器上使用請求的Accept-Language
頭。在頁面提供/渲染之前載入資料還可以防止潛在的佈局變化或載入指示器。