新浪微博的Jobs运作任务
新浪微博的Jobs运行任务
function Jobs() { this._jobTable = [] } Jobs.prototype = { _registedJobTable: {}, initialize: function() {}, _registJob: function(jobName, rel) { this._registedJobTable[jobName] = rel }, add: function(jobName) { this._jobTable.push(jobName) }, start: function() { var jobs = this._jobTable; var regJobs = this._registedJobTable; var i = 0; var joblen = this._jobTable.length; var getTime = function() { return new Date().valueOf() }; var interNum = window.setInterval(function() { if (i >= joblen) { clearInterval(interNum); return } var jobName = jobs[i]; var job = regJobs[jobName]; i++; if (typeof job == "undefined") { console.log("<b>[" + jobName + "# is undefiend!!!</b>", { html: true }); return } var _try = true; var _start = getTime(); try { job.call() } catch(e) { console.log("<b>[" + jobName + "] failed!!!</b>", { html: true }); _try = false } finally { if (_try) { var _end = getTime(); console.log("[" + jobName + "] done in " + (_end - _start) + "ms.") } } }, 10) }, call: function(jobName, args) { if (typeof this._registedJobTable[jobName] != "undefined") { this._registedJobTable[jobName].apply(this, args) } else { console.log("#" + jobName + "# is undefined!!!", { color: "#900", bgColor: "#FFF;" }) } } }; $registJob = function(name, rel) { Jobs.prototype._registJob(name, rel) };
测试用例:
$registJob('topic' , function() { for(var i = 0 ; i < 10000000 ; i++) { var arr = new Array(10000); } alert('function1 ends'); }); $registJob('loadComment' , function() { for(var i = 0 ; i < 100000 ; i++) { var arr = new Array(10000); } alert('function2 ends'); }); $registJob('testFun' , function() { for(var i = 0 ; i < 100000 ; i++) { var arr = new Array(10000); } alert('function3 ends'); }); function main() { var jobs = new Jobs(); jobs.add("topic"); jobs.add("loadComment"); jobs.add('aaa'); jobs.start(); }; window.onload = main;
按照任务的方式来使制定的代码运行,巧妙的地方在于使用了setInterval,将函数的运行放到了不同的闭包中,如果其中的一个函数出了错,不会影响到其他的函数继续运行,其中添加了日志处理,记录下来每个job运行了多长时间。
1 楼
luochong
2011-11-20
不错!