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; |