UNPKG

q_stack

Version:

Stack work for promises based on 'q' to prevent to much calls

60 lines (54 loc) 1.87 kB
var Q = require('q'); var _ = require('underscore-node'); var id = 0; var defaultMaxFunctions = 10 var que = {}; var defaultStackName = "__default__"; module.exports = { maxCalls: function (maxCalls, stackName) { if (maxCalls && maxCalls < 1) { maxCalls = 1; } stackName = stackName || defaultStackName; que[stackName] = que[stackName] || { maxFunctions: maxCalls || defaultStackName }; }, call: function (functionObject, args, stackName) { stackName = stackName || defaultStackName; var deffered = Q.defer(); que[stackName] = que[stackName] || { maxFunctions: defaultMaxFunctions }; que[stackName]["queue"] = que[stackName]["queue"] || []; que[stackName]["execute"] = que[stackName]["execute"] || []; que[stackName]["queue"].push({ func: functionObject, args: args, funcDeffered: deffered }); function functionReady(stackName, runId) { var func = _.find(que[stackName]["execute"], function (item) { return item.id == runId; }); var index = que[stackName]["execute"].indexOf(func); que[stackName]["execute"].splice(index, 1); startNext(); } function startNext() { if (que[stackName]["execute"].length <= que[stackName].maxFunctions && que[stackName]["queue"].length > 0) { id++; var runId = id; var queFunc = _.first(que[stackName]["queue"]); var exeFunc = queFunc.func.apply(null, queFunc.args); var runFunc = exeFunc.then(function (data) { functionReady(stackName, runId); queFunc.funcDeffered.resolve(data); }, function (err) { queFunc.funcDeffered.reject(err); }); que[stackName]["execute"].push({ id: runId, func: runFunc }); var index = que[stackName]["queue"].indexOf(queFunc); que[stackName]["queue"].splice(index, 1); } } startNext(); return deffered.promise; } };