MST

星途 面试题库

面试题:Svelte可写存储(writable store)源码的基本结构是什么

请简要描述Svelte中writable store源码里主要的组成部分,包括用到的关键函数和数据结构,并说明它们是如何协同工作来实现可写存储功能的。
26.8万 热度难度
前端开发Svelte

知识考点

AI 面试

面试题答案

一键面试
  1. 主要组成部分
    • writable函数:这是创建可写存储的入口函数。
    • subscribe函数:用于订阅存储值的变化,返回一个取消订阅的函数。
    • set函数:用于设置存储的新值,并触发订阅者更新。
    • update函数:用于基于当前值计算并设置新值,同样会触发订阅者更新。
  2. 关键数据结构
    • subscribers数组:用于存储所有订阅者的回调函数。每个订阅者通过调用subscribe函数将其回调函数添加到这个数组中。
  3. 协同工作方式
    • 创建存储:调用writable函数时,传入初始值,它内部会初始化subscribers数组,并返回一个包含subscribesetupdate函数的对象。
    • 订阅:当调用subscribe函数时,会将传入的回调函数添加到subscribers数组中。同时返回一个取消订阅函数,该函数可以从subscribers数组中移除对应的回调函数。
    • 设置值:调用set函数时,会更新存储的内部值,并遍历subscribers数组,依次调用每个订阅者的回调函数,将新值传递给它们,从而通知订阅者值发生了变化。
    • 更新值:调用update函数时,会传入一个更新函数,该更新函数接收当前值并返回新值。update函数先通过这个更新函数计算出新值,然后像set函数一样,设置新值并通知所有订阅者。
// 简化的Svelte writable store实现示例
function writable(start) {
    let value = start;
    const subscribers = [];

    const subscribe = (run) => {
        subscribers.push(run);
        run(value);
        return () => {
            const index = subscribers.indexOf(run);
            if (index!== -1) {
                subscribers.splice(index, 1);
            }
        };
    };

    const set = (newValue) => {
        value = newValue;
        subscribers.forEach(run => run(value));
    };

    const update = (updater) => {
        set(updater(value));
    };

    return { subscribe, set, update };
}