q_stack
Version:
Stack work for promises based on 'q' to prevent to much calls
60 lines (54 loc) • 1.87 kB
JavaScript
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;
}
};