コンテンツにスキップ:
svelte の #await ブロックは、非同期データを処理するのに非常に便利です。
<script> import Loader from "$components/forms/Helpers/Loader.svelte"; export let data; // let's say data.myPromise is a promise. </script> {#await data.myPromise} <!-- This is what shows while the promise is pending --> <Loader /> {:then results} <!-- Shows this if/when the promise resolves successfully --> {#each results as result} <li>{result}</li> {/each} {:catch error} <!-- Shows this if/when the promise rejects --> <p class="text-red">{error?.message ?? "Something went wrong"}</p> {/await}
これは基本的に #await ブロックが svelte でどのように動作するかです。 Promise の状態に基づいてさまざまなコンテンツが表示されます。保留中は読み込みインジケーター、解決された場合は結果、拒否された場合はエラー メッセージが表示されます。
しかし、Promise が解決または拒否されたときに (乾杯など)、特定の関数を実行したいとします。
Promise が解決または拒否されたときに特定の関数を実行する方法は次のとおりです。
<script> import { toast } from "svelte-sonner"; /** * Displays a success toast * @param {number | string} resultsLength - Number of results */ function showSuccess (resultsLength) { toast.success(`${resultsLength} result${resultsLength > 1 ? "s" : ""} retrieved!`) } /** * Displays an error toast * @param {string} [errorMessage] - Error message to display */ function showError(errorMessage) { toast.error(`An Error Occured`, { message: errorMessage ?? "Unknown Error" }) } </script> {#await data.myPromise} <!-- Displays while the promise is pending --> <Loader /> {:then results} <!-- Run showSuccess when the promise resolves --> {showSuccess(results.length)} <!-- Display results --> {#each results as result} <li>{result}</li> {/each} {:catch error} <!-- Run (trigger) showError when the promise rejects --> {showError(error.message)} <!-- Display error message --> <p class="text-red">{error?.message ?? "Something went wrong"}</p> {/await}
これで、コード ブロックに到達するたびに関数が実行されます。
もう一つ...
これらの関数が実行されると、返されたテキストはすべてブラウザに表示されます。これは一種の回避策だからです。私たちが使用した構文は、通常、返された文字列/数値をブラウザーに表示することを目的としています。何も返さなかった場合でも、デフォルトの未定義が返されます。そして、この文字列 (通常は意味をなさない) がエンド ユーザーに表示されます。このようなもの:
エンドユーザーにとっては意味がありません ?♂️?♀️
したがって、必ず空の文字列を返すか、関数を非表示のブロックでラップするようにしてください。
このメソッドでは、関数から必ず空の文字列を返します。
<script> import { toast } from "svelte-sonner"; /** * @param {number | string} resultsLength * @returns {string} - Empty string to avoid display issues */ function showSuccess (resultsLength) { toast.success(`${resultsLength} result${resultsLength > 1 ? "s" : ""} retrieved!`) return ""; // Return an empty string } /** * @param {string} [errorMessage] * @returns {string} - Empty string to avoid display issues */ function showError(errorMessage) { toast.error(`An Error Occured`, { message: errorMessage ?? "Unknown Error" }) return ""; // Return an empty string } </script> {#await data.myPromise} <!-- Display this while the promise is pending --> <Loader /> {:then results} <!-- Run showSuccess --> {showSuccess(results.length)} <!-- Won't render any text in the UI --> <!-- This shows if/when the promise is resolved --> {#each results as result} <li>{result}</li> {/each} {:catch error} <!-- Run showError --> {showError(error.message)} <!-- Won't render any text in the UI --> <!-- This shows if/when the promise is rejected --> <p class="text-red">{error?.message ?? "Something went wrong"}</p> {/await}
これにより、空の文字列が返されるようになります。
--- または ---
このメソッドでは、代わりに UI で関数ブロックを非表示にするため、返されるテキストはユーザーの目から見えなくなります。
<script> import { toast } from "svelte-sonner"; /** * @param {number | string} resultsLength */ function showSuccess (resultsLength) { toast.success(`${resultsLength} result${resultsLength > 1 ? "s" : ""} retrieved!`) // No explicit return necessary. Returns undefined by default } /** * @param {string} [errorMessage] * @returns {string} */ function showError(errorMessage) { toast.error(`An Error Occured`, { message: errorMessage ?? "Unknown Error" }) // No explicit return necessary. Returns undefined by default } </script> {#await data.myPromise} <!-- Display this while the promise is pending --> <Loader /> {:then results} <div class="hidden"> <!-- Hide the function block --> <!-- Display results --> {showSuccess(results.length)} </div> <!-- This shows if/when the promise is resolved --> {#each results as result} <li>{result}</li> {/each} {:catch error} <div class="hidden"><!-- Hide the function call --> {showError(error.message)} <div> <!-- This shows if/when the promise is rejected --> <p class="text-red">{error?.message ?? "Something went wrong"}</p> {/await} <style> .hidden { display: none; } </style>
この CSS ベースのメソッドは、返されたテキストを確実に非表示にします。
ハッピーハッキング
以上が#await ブロックが Svelte(Kit) で解決されるときに関数を実行するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。