【问题标题】:Filter retults of a Svelte Promise过滤 Svelte Promise 的结果
【发布时间】:2021-01-23 02:30:07
【问题描述】:

在使用 Svelte 制作我的第一个应用程序时,我很喜欢它,除了在从名为 search 的文本输入中过滤承诺结果时出现的以下内容。 p>

在承诺解决之前过滤 products 失败,因为 productsfunction 类型。

在继续之前,我必须包含 type 检查...

typeof products === "object" && ...

{#await promise then products}
    <div class="flex justify-center flex-wrap">
        {#each typeof products === "object" && 
            products.filter((s) => 
                s.name.toLocaleLowerCase().includes(search.toLocaleLowerCase())
            ) as product
        }
            <Product
                {product}
                {handleSelectProduct}
                selected={selectedProducts.includes(product)}
            />
        {/each}
    </div>
{/await}

有没有办法避免这种情况?

谢谢

【问题讨论】:

  • 过滤应该总是在 promise 解决之后进行。请您将您的承诺代码添加到问题中吗?

标签: svelte-3


【解决方案1】:

应该不需要验证typeof products === "object"。但最好将逻辑(如过滤器)排除在模板之外并保持模板“精简”。

参见下面的示例(可以在https://svelte.dev/repl/ 中运行)

<script>
  let search = "c";
  let promise = new Promise((resolve) => {
    resolve([{ name: "abc" },{ name: "bcd" },{ name: "cde" },{ name: "def" }]);
  });

  $: filtered = promise.then((r) =>
    r.filter((s) =>
      s.name.toLocaleLowerCase().includes(search.toLocaleLowerCase())
    )
  );
</script>

<input bind:value={search}>

{#await filtered then products}
  <ul>
    {#each products as product}
    <li>{product.name}</li>
    {/each}
  </ul>
{/await}

{#await promise then products}
  <ul>
    {#each products.filter((s) =>
      s.name.toLocaleLowerCase().includes(search.toLocaleLowerCase())) as product
    }
    <li>{product.name}</li>
    {/each}
  </ul>
{/await}

两个块的结果相同,因此不需要检查typeof(但第一个检查更容易一些)。

如果您遇到需要验证产品类型的问题,您应该检查承诺的结果。

【讨论】:

  • 谢谢! 1.您的第二个版本是我的第一次尝试,由于我给出的原因它失败了。 (App.svelte:159 Uncaught TypeError: ctx[15].filter is not a function) 2. 在您的第一个版本中,您的过滤器正在过滤承诺的返回,它不会实时过滤,而只会过滤返回数据?
  • 你能得到ctx[15]的值吗?由于某种原因它没有得到一个数组,我认为它与await 块无关。它可能会获得空值或其他值,或者被多次调用,但我认为您正在寻找错误的区域。另外,数组和对象都返回typeof 的对象,所以Array.isArray(products) 更安全。
猜你喜欢
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多