Skip to content

Instantly share code, notes, and snippets.

@deepakshrma
Created June 26, 2022 09:42
Show Gist options
  • Save deepakshrma/41f708c040f0d65bec5f0a4d97836889 to your computer and use it in GitHub Desktop.
Save deepakshrma/41f708c040f0d65bec5f0a4d97836889 to your computer and use it in GitHub Desktop.
JavaScript Observable
const debounce = (fn, ms = 0) => {
let id;
return (...args) => {
if (id) clearTimeout(id);
id = setTimeout(() => fn(...args), ms);
};
};
const observable = (render) => {
const that = {};
const _render = debounce(render);
const handler = {
get(target, prop) {
return target[prop];
},
set(target, prop, value) {
if (target[prop] === value) return target;
target[prop] = value;
_render(target);
return target;
},
};
return new Proxy(that, handler);
};
const log = console.log.bind(null, new Date());
const state = observable(log);
state.b = "b";
state.b1 = "b1";
state.b2 = "b2";
state.b2 = "b2";
state.b3 = "b3";
log(state.b);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment