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