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

'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);
}
})
}
}