From b9249953cdf0acc5ba63478985b4fa52dd5a2556 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Strau=C3=9F?= Date: Tue, 9 Jan 2018 12:48:11 +0100 Subject: [PATCH] feature(functions): cacheAsyncValue --- src/functions/functions.js | 44 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/functions/functions.js diff --git a/src/functions/functions.js b/src/functions/functions.js new file mode 100644 index 0000000..f090b6d --- /dev/null +++ b/src/functions/functions.js @@ -0,0 +1,44 @@ +goog.module('clulib.functions'); + +/** + * Creates an async function that runs the provided parameter 'func' + * async function only once. + * + * When called for the first time, the given async function is called + * and its returned result or error is cached. Subsequent calls will + * return the cached result or error. + * + * @param {function():Promise} func + * @returns {function():Promise} + * @template T + */ +function cacheAsyncValue (func) { + let done = false; + let isError = false; + + /** + * @type {T} + */ + let result = null; + let error = null; + + return async function () { + if (!done) { + try { + result = await func(); + } catch (e) { + error = e; + isError = true; + } finally { + done = true; + } + } + + if (isError) + throw error; + else + return result; + }; +} + +exports = {cacheAsyncValue};