たった 64 行で Node.js v6.6.0 で動く非同期 Redux っぽいのできたぞ!!1

読了まで:約0分


"use strict";
function createMapper(validate) {
const uid   = Date.now().toString() + '+' + Math.random().toString();
const get   = (state) => { return ( typeof(state [[uid]] ) !== 'undefined' ) ? state [[uid]]  : null };
const map   = (state, value)  => { let v = {}; v [[uid]]  = value; return Object.assign({}, state, v) };
const from    = (state) => {
const value = get(state);
const err   = validate(value);
return ( err === null ) ? Promise.resolve(value) : Promise.reject(err) ;
};
const create  = (state, value) => {
const err = validate(value);
return ( err === null ) ? Promise.resolve(map(state, value)) : Promise.reject(err) ;
};
return { from: from, create: create };
}
function createDispatcher(initialState, handle) {
const once = (fn, ms) => {
let t; t = setTimeout(() => { fn(); clearTimeout(t); t = null }, ms);
};
const apply = (state) => {
let snapshot = Object.assign({}, state);
once(() => { handle(null, snapshot); snapshot = null }, 0);
return Promise.resolve(state);
};
let queues = [];
const update = (p1) => {
while (queues.length !== 0) {
const task = queues.shift();
p1 = p1.then((state) => { return task(state) }, (err) => { handle(err, null) });
}
return p1.then((state) => { return apply(state) }, (err) => { handle(err, null) });
};
let loop; loop = (p1, sleep) => {
once(() => { loop( (sleep ? p1 : update(p1)), queues.length === 0 ) }, 15);
};
loop(Promise.resolve(initialState), false);
return (action) => { queues.push(action) };
}
(() => {
const validater   = (x) => { return typeof(x) === 'number' ? null : new TypeError('this is not number') };
const count       = createMapper(validater);
const onSnapshot  = (err, state) => { ( err !== null ) ? console.warn(err) : console.log(state) };
const dispatch    = createDispatcher(count.create({}, 0), onSnapshot);
const action      = (state) => { return count.from(state).then((x) => { return count.create(state, x + 1) }) };
setInterval(() => { dispatch(action) }, 1000);
setInterval(() => { dispatch(action) }, 2000);
})();

本日の​成果です。​見納めください。

ちなみに​これ、

たった​ 64 行で​ Node.js v6.6.0 で​動く​非同期 Redux っぽいの​できたぞ!!​1

って​タイトルで​言ってますが、​ Redux っぽい​感じ、と​いう​事を、​僕が​本当に​飲み込めているか​どうかには​疑問が​ある​ため、​ [[JavaScript]] 界隈で​詳しい​人の​批評、​待ってます。

と​いう​事で、​こちらからは​以上です。


追記: [[2018-02-05]]

この​記事を​書いた​当初、

たった​ 64 行で​ Node.js v6.6.0 で​動く​非同期 Flux っぽいの​できたぞ!!​1

と​言っていたのですが、​実際には​ Flux じゃなくて​ Redux じゃね?と​思ったので、​本文と​タイトルを​修正しました。

にゃるら(カラクリスタ)

『輝かしい青春』なんて失かった人。
次に備えて待機中。

今は趣味でプログラミングをして
生活しています。