Project

General

Profile

« Previous | Next » 

Revision 261548ff

Added by koszko about 2 years ago

emply an sh-based build system; make some changes to blocking

View differences:

common/once.js
5 5
 * Redistribution terms are gathered in the `copyright' file.
6 6
 */
7 7

  
8
"use strict";
9

  
10 8
/*
11 9
 * This module provides an easy way to wrap an async function into a promise
12 10
 * so that it only gets executed once.
13 11
 */
14 12

  
15
(() => {
16
    async function assign_result(state, result_producer)
17
    {
18
	state.result = await result_producer();
19
	state.ready = true;
20
	for (let cb of state.waiting)
21
	    setTimeout(cb, 0, state.result);
22
	state.waiting = undefined;
23
    }
13
async function assign_result(state, result_producer)
14
{
15
    state.result = await result_producer();
16
    state.ready = true;
17
    for (let cb of state.waiting)
18
	setTimeout(cb, 0, state.result);
19
    state.waiting = undefined;
20
}
24 21

  
25
    async function get_result(state)
26
    {
27
	if (state.ready)
28
	    return state.result;
22
async function get_result(state)
23
{
24
    if (state.ready)
25
	return state.result;
29 26

  
30
	return new Promise((resolve, reject) => state.waiting.push(resolve));
31
    }
27
    return new Promise((resolve, reject) => state.waiting.push(resolve));
28
}
32 29

  
33
    function make_once(result_producer)
34
    {
35
	let state = {waiting : [], ready : false, result : undefined};
36
	assign_result(state, result_producer);
37
	return () => get_result(state);
38
    }
30
function make_once(result_producer)
31
{
32
    let state = {waiting : [], ready : false, result : undefined};
33
    assign_result(state, result_producer);
34
    return () => get_result(state);
35
}
39 36

  
40
    window.make_once = make_once;
41
})();
37
/*
38
 * EXPORTS_START
39
 * EXPORT make_once
40
 * EXPORTS_END
41
 */

Also available in: Unified diff