SvelteKit-如何在后续调用时在服务器呈现的页面中正确显示加载指示器

Sub*_*ngh 8 javascript promise svelte sveltekit

我有一个页面(动态路由),我在其中从加载函数中的 API 获取数据。在获取数据之前显示加载指示器的正确方法是什么?我尝试过的事情:

  1. 使用await 块。我返回一个获取函数的承诺,然后在正常的脚本标记中,导出一个承诺变量。然后,我在操作数据后手动解决这个承诺。
<script context="module">
  export async function load({ fetch, page }) {   
    let collectionId = page.params.id;    
    let endpoint = url;   
    const promise = fetch(endpoint);  
    return {props:{promise}}; 
  }
</script>
Run Code Online (Sandbox Code Playgroud)

然后在正常的脚本标签中

<script>
export let promise = new Promise(() => '');

promise = new Promise((resolve, reject) => {
    promise.then(function (response) {
      if(response.ok){
        console.log('response');
        response.json().then(function (json) {
          console.log('data in promise');
          console.log(json);
          let posts = json.map((post) => new Post(post));
          posts = posts.sort(function (a, b) {
            return a.id - b.id;
          });
          resolve(posts);
        });
      }else{
        response.text().then((text)=>reject(text));
      }
    });
});
</script>
Run Code Online (Sandbox Code Playgroud)

然后在 HTML 中

{#await promise}
    <Shimmer items="3" />
{:then posts}
    <Cards data={posts} />
{:catch error}
    <Error message={error}/>
{/await}
Run Code Online (Sandbox Code Playgroud)

我猜,这第一次工作正常,当页面呈现在服务器端时,这工作正常。但在后续调用中,我的承诺解析逻辑不会被调用,并且我直接在我的等待块中接收承诺,其中没有逻辑来操纵它。

  1. 我导出一个变量以从加载函数接收最终处理的数据,并在 HTML 中尝试显示加载指示器,直到使用 {if} 块未定义该变量为止。当变量实际上未定义时,这第一次起作用,但在后续调用中,只有该变量的值发生变化,但它永远不会未定义。

let posts;

{#if posts===undefined}
Loading...
{:else}
{posts}
{/if}
Run Code Online (Sandbox Code Playgroud)

Sub*_*ngh 11

所以我通过使用商店解决了这个问题navigating。我不知道这是否是正确的方法。但这似乎对我来说效果很好。

在服务器渲染页面并将控制权传递到客户端后,navigating从一个页面导航到另一页面时,store 为 true。(阅读更多)

所以在我的 __layout.svelte 中,我正在做

{#if $navigating} Loading... {:else} Content {/if}