You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
756 B
JavaScript
41 lines
756 B
JavaScript
'use strict';
|
|
|
|
const Promise = require("bluebird");
|
|
|
|
module.exports = function(func) {
|
|
let operationQueued = false;
|
|
let queuedHandlers = [];
|
|
let currentPromise;
|
|
|
|
function runFunc() {
|
|
return Promise.try(() => {
|
|
return func();
|
|
}).tap(() => {
|
|
if (operationQueued === true) {
|
|
currentPromise = runFunc();
|
|
|
|
queuedHandlers.forEach((handler) => {
|
|
handler(currentPromise);
|
|
});
|
|
|
|
operationQueued = false;
|
|
queuedHandlers = [];
|
|
} else {
|
|
currentPromise = null;
|
|
}
|
|
});
|
|
}
|
|
|
|
return function() {
|
|
return new Promise((resolve, reject) => {
|
|
if (currentPromise == null) {
|
|
currentPromise = runFunc();
|
|
resolve(currentPromise);
|
|
} else {
|
|
operationQueued = true;
|
|
queuedHandlers.push(resolve);
|
|
}
|
|
})
|
|
|
|
}
|
|
} |