From 5acccd692a171520e6ebad09388ddaa2596162ad Mon Sep 17 00:00:00 2001 From: Egor Date: Mon, 18 Mar 2024 11:07:30 +0300 Subject: [PATCH 1/2] simple implementation --- JavaScript/5c-chain.js | 58 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 JavaScript/5c-chain.js diff --git a/JavaScript/5c-chain.js b/JavaScript/5c-chain.js new file mode 100644 index 0000000..314098f --- /dev/null +++ b/JavaScript/5c-chain.js @@ -0,0 +1,58 @@ +const wrapAsync = + (fn) => + (...args) => + setTimeout(() => fn(...args), Math.random() * 1000); + +const readConfig = wrapAsync((data, callback) => { + console.log("data - ", data); + console.log("read config"); + + callback(null, data); +}); + +const selectFromDb = wrapAsync((query, callback) => { + console.log("query - ", query); + console.log("select from db"); + + callback(null, { cat: "Evgeniy" }); +}); + +const getHttpPage = wrapAsync((page, callback) => { + console.log("page - ", page); + console.log("Page retrieved"); + + callback(null, { page: "hello world!" }); +}); + +const chain = () => { + const stack = []; + + const executor = () => { + let result = () => null; + + const len = stack.length; + + for (let i = len - 1; i >= 0; i--) { + const [fn, args] = stack.pop(); + + result = fn.bind(null, ...args, result); + } + + result(); + }; + + executor.do = (cb, ...args) => { + stack.push([cb, args]); + + return executor; + }; + + return executor; +}; + +const startChain = chain() + .do(readConfig, "myConfig") + .do(selectFromDb, "select * from cities") + .do(getHttpPage, {}); + +startChain(); From 3c8244523d1339501794572a924a15061e5a45a4 Mon Sep 17 00:00:00 2001 From: Egor Date: Mon, 18 Mar 2024 13:57:17 +0300 Subject: [PATCH 2/2] add error handling --- JavaScript/5c-chain.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/JavaScript/5c-chain.js b/JavaScript/5c-chain.js index 314098f..0a1af28 100644 --- a/JavaScript/5c-chain.js +++ b/JavaScript/5c-chain.js @@ -35,7 +35,12 @@ const chain = () => { for (let i = len - 1; i >= 0; i--) { const [fn, args] = stack.pop(); - result = fn.bind(null, ...args, result); + const prev = result; + + result = (err, data) => { + if (err) return console.error({ err }); + fn(...args, prev); + }; } result();