我有一个商店,它根据用户的操作不时获取数据。这是一个存储,因为它的数据是全局使用的,主要是所有组件都需要可用的最新数据。
但是,对于一个特定的组件,我只需要加载第一个数据。
对于这个组件,没有理由在第一次获取后保持 subscribe()
函数运行。 那么,我怎样才能停止这个订阅功能?
Svelte doc's 中唯一的示例使用 onDestroy()
,但我需要手动停止此 subscribe()
。
我尝试了一个简单的“计数”(如果计数 > 1,取消订阅),但它不起作用。
import user from './store'
let usersLoaded = 0
const unsubscribe = user.subscribe(async (data) => {
if(data.first_name !== null) {
usersLoaded = usersLoaded + 1
}
if(usersLoaded > 1) {
unsubscribe;
}
});
这是一个完整的 REPL:
→ https://svelte.dev/repl/95277204f8714b4b8d7f72b51da45e67?version=3.35.0
答案 0 :(得分:2)
我不得不使用 unsubscribe()
而不是 unsubscribe
?
这是经过一些改进的最终工作 REPL: https://svelte.dev/repl/95277204f8714b4b8d7f72b51da45e67?version=3.35.0
答案 1 :(得分:1)
您可以使用自动订阅:$user 这也将自动取消订阅。 文档中有更多详细信息。
示例:
let user1 = null;
$: if ($user?.first_name && !user1) {
user1 = $user.first_name;
console.log('first user', $user.first_name);
}
而且你在这里真的不需要一个可写的存储。您可以使用可读的并使用 set 方法来处理获取。
类似于:
const user = readable(defaultUser, set => {
.... fetch the data ....
.... set(data)
}
顺便说一句:这已经是异步代码了,您可以使用 set(data) 来存储获取结果。
答案 2 :(得分:1)
您可以试试 Svelte 的 get
。订阅适用于您需要对变化做出反应的情况;这是一种长期的关系。如果您只需要商店的当前值,get
是您要走的路。
有时,您可能需要检索您未订阅的商店的值。 get
允许您这样做。
import { get } from 'svelte/store';
const value = get(store);