<script>
import { writable, derived } from'svelte/store';
// 定义三个Svelte store
const storeA = writable<number>();
const storeB = writable<boolean>();
const storeC = writable<string>();
// 派生存储
const resultStore = derived([storeA, storeB, storeC], ([$storeA, $storeB, $storeC]) => {
if ($storeA === undefined || $storeB === undefined || $storeC === undefined) {
return;
}
if ($storeB) {
return ($storeA ** 2) * $storeC.length;
} else {
return ($storeA ** 3) + $storeC.charCodeAt(0);
}
});
// 处理异步操作示例
const fetchData = async () => {
try {
// 模拟异步获取数据
const dataA = await new Promise<number>((resolve) => setTimeout(() => resolve(5), 1000));
const dataB = await new Promise<boolean>((resolve) => setTimeout(() => resolve(true), 1500));
const dataC = await new Promise<string>((resolve) => setTimeout(() => resolve('hello'), 2000));
storeA.set(dataA);
storeB.set(dataB);
storeC.set(dataC);
} catch (error) {
console.error('Error fetching data:', error);
}
};
fetchData();
</script>
{#if $resultStore === undefined}
Loading...
{:else}
Result: {$resultStore}
{/if}
说明
- 派生存储实现:使用Svelte的
derived
函数,根据storeA
、storeB
、storeC
的值计算resultStore
。在计算时,首先检查三个store是否都有值,避免未定义的情况。然后根据storeB
的值进行不同的计算。
- 异步操作处理:通过
async
函数模拟异步获取数据的过程,使用setTimeout
模拟网络延迟。在获取到数据后,通过set
方法更新相应的store,从而触发resultStore
的重新计算。在实际应用中,await
后面通常是实际的异步API调用,如fetch
等。同时,使用try...catch
块捕获异步操作中可能出现的错误并进行处理。