From 46055cb17c8f1687d8c841db7d222dd5cb582577 Mon Sep 17 00:00:00 2001 From: Legioner9 Date: Tue, 6 Jul 2021 16:01:50 +0700 Subject: [PATCH] add JavaScript/6-timeout-async_callback.js --- JavaScript/6-timeout-async_callback.js | 45 ++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 JavaScript/6-timeout-async_callback.js diff --git a/JavaScript/6-timeout-async_callback.js b/JavaScript/6-timeout-async_callback.js new file mode 100644 index 0000000..d9d50f4 --- /dev/null +++ b/JavaScript/6-timeout-async_callback.js @@ -0,0 +1,45 @@ +'use strict'; + +// Wrapper will prevent call after timeout + +const timeoutCallback = (delayCallback, fn) => { + // define flag + let killFlag = false; + + const timeout = setTimeout(() => { + killFlag = true; + }, delayCallback); + + return (...args) => { + const callback = args[args.length - 1]; + if (typeof callback === 'function') { + args[args.length - 1].flag = killFlag; + timeout.close(); + } + fn(...args); + }; +}; + +// Usage + +const fn = (par, callback) => { + console.log('Function called, par:', par); + if(!callback.flag) callback(null, par); +}; + +const fn100 = timeoutCallback(100, fn); +const fn200 = timeoutCallback(200, fn); + +setTimeout(() => { + fn100('first', (err, data) => { + console.log('Callback', data); + }); + fn200('second', (err, data) => { + console.log('Callback', data); + }); +}, 150); + +// console: +// Function called, par: first +// Function called, par: second +// Callback second