subscribe
不返回您作为参数传递的函数:它返回一个实现取消订阅行为的新函数。
如果您查看自定义商店合同的 Svelte 文档(已添加重点),这将更容易理解:
店铺合同
store = { subscribe: (subscription: (value: any) => void) => (() => void), set?: (value: any) => void }
通过实现 store 契约,你可以创建自己的 store 而不依赖于svelte/store
:
- 商店必须包含一个
.subscribe
方法,该方法必须接受订阅函数作为其参数。此订阅函数必须在调用 .subscribe 时立即与商店的当前值同步调用。每当商店的价值发生变化时,商店的所有活动订阅函数都必须在以后同步调用。
- 该
.subscribe
方法必须返回一个取消订阅函数。调用取消订阅函数必须停止其订阅,并且商店不能再次调用其对应的订阅函数。
如果您想进一步证明 的返回值与subscribe
您传递的函数不同,只需提取 的类型store.subscribe
:
Type subscribe = (subscription: (value: any) => void) => (() => void)
subscription
参数的(value: any) => void
签名 与返回值的签名不匹配() => void
。
这是商店合约的简单实现,演示了如何构建取消订阅功能。
class Store {
constructor(init) {
this.subscribers = {};
this.value = init;
}
subscribe(callback) {
callback(this.value);
const id = Symbol()
this.subscribers[id] = callback;
return () => delete this.subscribers[id]
// ^^^ unsubscribe function here ^^^
}
set(value) {
this.value = value;
for (const id of Object.getOwnPropertySymbols(this.subscribers)) {
this.subscribers[id](value)
}
}
}