NodeJS 如何在Svelte中重做{#await...}?

jdgnovmf  于 2023-11-17  发布在  Node.js
关注(0)|答案(2)|浏览(162)

我希望这是完全客户端渲染。所以,我不想刷新页面只是为了重做的承诺。
这是我做的代码。

{#await myFetchMethod("/api/v1/me")}
    <Loading />
{:then loggedIn}
    {#if loggedIn}
        <Link class="mb-0 h3" to="/profile">Profile</Link>
        <Link class="mb-0 h3" to="/logout">Logout</Link>
    {:else}
        <Link class="mb-0 h3" to="/login">Login</Link>
        <Link class="mb-0 h3" to="/register">Register</Link>
    {/if}
{:catch error}
    <p>Can't connect to the server!</p>
    <button on:click={whatShouldIDoHere}>Refresh</button>
{/await}

字符串
我希望刷新按钮只是重做myFetchMethod("/api/v1/me") promise并按预期获得结果。

h22fl7wq

h22fl7wq1#

与将promise硬编码到API请求中不同,您可以将其存储到一个变量中,添加一个刷新变量的函数(即再次触发查询),并将该函数绑定到按钮的click事件。
就像这样:

<script>
  let doLoginCheck = checkIfLoggedIn()

  function tryAgain() {
    doLoginCheck = checkIfLoggedIn()
  }

  function checkIfLoggedIn() {
    return fetch('/api/v1/me')
      .then(res => {
        if (!res.ok) {
          throw new Error('Cannot connect to server!');
        }
        return res.json();
      });
  }
</script>

{#await doLoginCheck}
  <Loading />
{:then loggedIn}
  {#if loggedIn}
    <Link class="mb-0 h3" to="/profile">Profile</Link>
    <Link class="mb-0 h3" to="/logout">Logout</Link>
  {:else}
    <Link class="mb-0 h3" to="/login">Login</Link>
    <Link class="mb-0 h3" to="/register">Register</Link>
  {/if}
{:catch error}
  <p>{error.message}</p>
  <button on:click={tryAgain}>Refresh</button>
{/await}

字符串

s1ag04yj

s1ag04yj2#

向函数传递一个参数,该参数在更改时触发重新运行。

{#await myFetchMethod("/api/v1/me", triggerParameter)}
...
{:then result}
...
{:catch error}
...
{/await}

字符串
这个参数不一定要在函数内部使用。但是当参数的值改变时,函数会再次运行。(当输入改变时,会有一个新的输出)。
要让它由刷新按钮触发,您可以执行以下操作:

<script>
  let trig = false;
</script>

{#await myFetchMethod("/api/v1/me", trig)}
    <Loading />
{:then loggedIn}
   ...
{:else}
   ...
{:catch error}

    <p>Can't connect to the server!</p>
    <button on:click={() => trig = !trig}>Refresh</button>
{/await}

相关问题