Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
</body>
</html>
 
function Semaphore(count = 1) {
  const resolvers = [];
  let startCount = count;
   return {
     aquire() {
       return new Promise(resolve => {
         if(startCount) { resolve(); startCount -= 1; }
         else resolvers.push(resolve);
       });
     },
     free() { 
       if(resolvers.length) resolvers.shift()(); 
       else startCount += 1;
     },
     async use(cb) { 
       await this.aquire(); 
       await cb(); 
       this.free() 
     },
     async done() {
       await Promise.all(Array.from({ length: count }, () => this.aquire()));
       startCount = count;
     },
   };
 }
const timer = ms => new Promise(resolve => setTimeout(resolve, ms));
(async function() {
  const s = Semaphore(3);
  for(let i = 0; i < 9; i++) {
    s.use(async () => {
     console.log(i + " start");
     await timer(5000 * Math.random());
     console.log(i + " end");
    });
  }
  await s.done();
  console.log("done");
})();
Output 300px

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
anonymouspro
0viewers