You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义Readable Store并延迟调用其set函数至满足指定条件?

延迟调用Readable Store的set函数实现按需API数据填充

完全可以实现这个需求。Svelte的Readable Store在创建时传入的start函数中,你可以保留set方法的引用,然后在满足特定条件时手动触发它来更新Store数据,完美适配你想自行控制API调用时机的场景。

实现示例

首先创建一个自定义的Readable Store,把用于触发API请求和更新数据的方法挂载到Store实例上:

import { readable } from 'svelte/store';

export const apiDataStore = readable(null, (set) => {
  // 挂载自定义方法到Store,用于手动触发API请求和数据更新
  apiDataStore.loadData = async () => {
    try {
      // 替换为你的API地址
      const response = await fetch('https://api.example.com/data');
      const data = await response.json();
      set(data); // 调用set填充Store数据
    } catch (err) {
      console.error('API请求失败:', err);
      set(null); // 出错时设置默认值
    }
  };

  // 可选:返回清理函数,比如取消未完成的请求
  return () => {};
});

在组件中使用

在需要的时机(比如按钮点击、组件挂载完成等)调用Store的自定义方法:

<script>
  import { apiDataStore } from './stores.js';
</script>

<button on:click={() => apiDataStore.loadData()}>加载数据</button>

{#if $apiDataStore}
  <div>
    <h3>加载完成的数据:</h3>
    <pre>{JSON.stringify($apiDataStore, null, 2)}</pre>
  </div>
{:else}
  <p>点击上方按钮加载API数据</p>
{/if}

进阶优化:避免重复请求

如果担心多次触发导致重复API调用,可以在方法里添加加载状态锁:

import { readable } from 'svelte/store';

export const apiDataStore = readable(null, (set) => {
  let isLoading = false;

  apiDataStore.loadData = async () => {
    if (isLoading) return;
    isLoading = true;

    try {
      const response = await fetch('https://api.example.com/data');
      const data = await response.json();
      set(data);
    } catch (err) {
      console.error('API请求失败:', err);
      set(null);
    } finally {
      isLoading = false;
    }
  };

  return () => {};
});

内容的提问来源于stack exchange,提问作者Nick Jennings

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:46:09