Package Exports
- await-semaphore
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (await-semaphore) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
await-semaphore
Awaitable semaphore/mutex
A semaphore implementation using ES6 promises and supporting 3 styles:
- async/await style (needs typescript)
- thunk style (automatic acquire/release)
- promise style
Also includes Mutex
as a convenience for new Semaphore(1)
.
API
new Semaphore(count: number)
Create a new semaphore with the given count.
import {Semaphore} from 'await-semaphore';
var semaphore = new Semaphore(10);
semaphore.acquire(): Promise<() => void>
Acquire the semaphore and returns a promise for the release function. Be sure to handle release for exception case.
semaphore.acquire()
.then(release => {
//critical section...
doSomething()
.then(res => {
//...
release();
})
.catch(err => {
//...
release();
});
});
semaphore.use(thunk: () => Promise): Promise
Alternate method for using the semaphore by providing a thunk. This automatically handles acquire/release.
semaphore.use(() => {
//critical section...
});
new Mutex()
An alias for new Semaphore(1)
. Mutex has the same methods as Semaphore.
import {Mutex} from 'await-semaphore';
var mutex = new Mutex();
Examples
Create a version of fetch()
with concurrency limited to 10.
async/await style (typescript)
var semaphore = new Semaphore(10);
async function niceFetch(url) {
var release = await semaphore.acquire();
var result = await fetch(url);
release();
return result;
}
thunk style (javascript)
var semaphore = new Semaphore(10);
function niceFetch(url) {
return semaphore.use(() => fetch(url));
}
promise style (javascript)
var semaphore = new Semaphore(10);
function niceFetch(url) {
return semaphore.acquire()
.then(release => {
return fetch(url)
.then(result => {
release();
return result;
});
});
}