scalra
Version:
node.js framework to prototype and scale rapidly
96 lines (76 loc) • 2.21 kB
JavaScript
//
//
// icTF.js
//
//
//
// 2011-05-27 修正 nextTick 造成管線阻塞
// 2011-05-28 runTF 裡, l_busy設為 true 和 l_nativeRunTF 的執行順序 issue (假如 tf 只有一項, 則會有 l_busy 為 true 卻停止 tick 的情況.
// 2011-05-28 l_nativeRunTF 裡, 函數執行完畢釋放 object issue
// 2011-07-20 更換 fifo queue algorithm (http://code.stephenmorley.org/javascript/queues/)
// 2011-09-04 簡化執行流程
//
//
//
//-----------------------------------------
// define local variables
//
//-----------------------------------------
//-----------------------------------------
// define local function
//
//-----------------------------------------
//-----------------------------------------
var l_objPool = {};
exports.createObj = function() {
var uid = UTIL.createUUID();
l_objPool[uid] = {
funcTable: [],
funcCounter: 0,
retryTimes: 0,
};
return uid;
};
exports.addTF = function(pObj, pFunc) {
if (l_objPool.hasOwnProperty(pObj) === false)
return;
//console.log('[icTF]::addTF::adding pObj: ' + pObj + ' and pFunc: ' + pFunc);
var obj = l_objPool[pObj];
obj.funcTable.push(
{
funcKey: pFunc,
ready: false,
runningKey: false,
completeKey: false,
},
);
};
exports.runTF = function(pObj) {
if (l_objPool.hasOwnProperty(pObj) === false) {
console.log(
'[icTF]::runTF::' + SR.Tags.ERR + 'pObj= ' + pObj + ' not found.');
return;
}
//console.log('[icTF]::runTF::'+'run pObj= ' + pObj);
l_objPool[pObj].ready = true;
l_objPool[pObj].funcTable[l_objPool[pObj].funcCounter].funcKey();
};
exports.setCompleted = function(pObj, pFunc) {
if (l_objPool.hasOwnProperty(pObj) === false)
return;
// find the completed event and remove it
for (var i = 0; i < l_objPool[pObj].funcTable.length; ++i) {
if (l_objPool[pObj].funcTable[i].funcKey === pFunc) {
l_objPool[pObj].funcTable[i].completeKey = true;
break;
}
}
// trigger next function
++l_objPool[pObj].funcCounter;
// if no more function, delete event
if (l_objPool[pObj].funcCounter === l_objPool[pObj].funcTable.length) {
//delete object
delete l_objPool[pObj];
} else
l_objPool[pObj].funcTable[l_objPool[pObj].funcCounter].funcKey();
};