26 lines
		
	
	
		
			No EOL
		
	
	
		
			687 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			26 lines
		
	
	
		
			No EOL
		
	
	
		
			687 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
// This implements a simple wrapper around an async function that prevents concurrent execution of the function from two asynchronous chains
 | 
						|
// It enforces that the running execution has to complete first before another one is started.
 | 
						|
function synchronized(asyncFn) {
 | 
						|
    let ensurePromise = null;
 | 
						|
 | 
						|
    return async (...args) => {
 | 
						|
        while (ensurePromise) {
 | 
						|
            try {
 | 
						|
                await ensurePromise;
 | 
						|
            } catch (err) {
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        ensurePromise = asyncFn(...args);
 | 
						|
 | 
						|
        try {
 | 
						|
            return await ensurePromise;
 | 
						|
        } finally {
 | 
						|
            ensurePromise = null;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
module.exports = synchronized; |