/
functions.js
44 lines (39 loc) · 869 Bytes
/
functions.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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<T>} func
* @returns {function():Promise<T>}
* @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};