Skip to content

Instantly share code, notes, and snippets.

@ahmedsakr
Created August 13, 2020 23:11
Show Gist options
  • Save ahmedsakr/6bfef329dc1da799aae5684f9bed9d1f to your computer and use it in GitHub Desktop.
Save ahmedsakr/6bfef329dc1da799aae5684f9bed9d1f to your computer and use it in GitHub Desktop.
import { Mutex, Semaphore } from 'async-mutex';
import material from 'materialize-css/dist/js/materialize';
let count = 0;
let clientLock = new Mutex();
let clientSempahore = new Semaphore(2);
// Server Simulation
function processCommand() {
count += 1;
return count;
}
// Network Delay Simulation
async function serverDelay() {
return new Promise(resolve => setTimeout(resolve, parseInt(Math.random() * 500)));
}
window.addEventListener('load', () => {
document.getElementById("genToast").addEventListener('click', async () => {
let release = await clientLock.acquire();
await serverDelay();
let number = processCommand()
await serverDelay();
let [semNumber, releaseSemaphore] = await clientSempahore.acquire();
material.toast({
html: `<span style="font-size: 48px; padding: 2rem;">#${number}</span>`,
displayLength: 1000,
completeCallback: () => releaseSemaphore()
});
release();
})
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment