UNPKG

762 BJavaScriptView Raw
1'use strict'
2
3// Adapted from https://blog.jcoglan.com/2016/07/12/mutexes-and-javascript/
4
5let Mutex = function () {
6 this._busy = false
7 this._queue = []
8}
9
10Mutex.prototype.synchronize = function (task) {
11 let self = this
12
13 return new Promise(function (resolve, reject) {
14 self._queue.push([task, resolve, reject])
15 if (!self._busy) {
16 self._dequeue()
17 }
18 })
19}
20
21Mutex.prototype._dequeue = function () {
22 this._busy = true
23 let next = this._queue.shift()
24
25 if (next) {
26 this._execute(next)
27 } else {
28 this._busy = false
29 }
30}
31
32Mutex.prototype._execute = function (record) {
33 let [task, resolve, reject] = record
34 let self = this
35
36 task().then(resolve, reject).then(function () {
37 self._dequeue()
38 })
39}
40
41module.exports = Mutex