1 | 'use strict'
|
2 |
|
3 |
|
4 |
|
5 | let Mutex = function () {
|
6 | this._busy = false
|
7 | this._queue = []
|
8 | }
|
9 |
|
10 | Mutex.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 |
|
21 | Mutex.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 |
|
32 | Mutex.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 |
|
41 | module.exports = Mutex
|