Svelte:如何手动停止订阅?

时间:2021-03-23 15:21:10

标签: javascript svelte

我有一个商店,它根据用户的操作不时获取数据。这是一个存储,因为它的数据是全局使用的,主要是所有组件都需要可用的最新数据。

但是,对于一个特定的组件,我只需要加载第一个数据。

对于这个组件,没有理由在第一次获取后保持 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

3 个答案:

答案 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);