很多人在用nodejs的settimeout(callback, delay[, arg][, ...])編寫定時任務時,習慣上直接操作callback外部的物件object(閉包的特點)。這樣做有乙個隱患,就是當callback真正執行的時候,外部物件object可能已經被銷毀了(比如執行了自定義的銷毀方法),導致對object進行的處理結果出現了很大的偏差,程式甚至有可能出現異常而退出。
解決這個問題其實很簡單,我們只需要在callback**中重新通過某種方式獲取該物件,檢查一下該物件是否已被銷毀,即可避免上面描述的問題。但是,當程式中需要很多這樣的需求時,並且是乙個團隊在合作寫**,這樣就很難避免上述情況的發生。為了規避定時任務的閉包問題,我寫了乙個延遲呼叫類,**如下:
/*** script: delaycall.js
* description: 延遲呼叫,規避定時任務的閉包問題
* authors: [email protected]
* date: 2016-04-19
*/var util = require('util');
var pqueue = require('./pqueue').pqueue;
/** * 延遲呼叫類
* @param search_func 物件查詢函式
*/var delaycall = exports.delaycall = function(search_func) ;
//延遲呼叫佇列
this._call_queue = new pqueue(delaycall.compare);
//物件查詢方法
this._search_func = search_func;
//設定間隔定時器。fixme:可以改為在框架的心跳機制中去執行run方法
//注:settimeout不支援修改系統時間
this._interval_id = setinterval(() => , 1000);
};//比較延遲呼叫
delaycall.compare = function(call1, call2) else
};//延遲呼叫序號自增
delaycall.prototype._addsequence = function() ;
/** * 延遲呼叫
* @param id 物件查詢方法_search_func根據id查詢出呼叫者物件
* @param method_name 呼叫者物件上要延遲呼叫的方法名
* @param params 要延遲呼叫的方法引數
* @param delay 延遲時間,單位秒
*/delaycall.prototype.call = function(id, method_name, params, delay) ;
this._call_queue.enqueue(call_elem);
this._call_map[call_id] = call_elem;
return call_id;
};//取消延遲呼叫
delaycall.prototype.cancelcall = function(call_id)
};//運轉一次
delaycall.prototype.run = function() else else }}
call_elem = pqueue.gethead();
}};
pqueue的實現請參考我的餓另一篇博文:用nodejs實現優先順序佇列pqueue
一種延遲方法呼叫的實現
原文 一種延遲方法呼叫的實現 需求場景 實現 定義任務介面 1inte ce itask 2 4 bool isrunning 5 void start 6 void stop 7 void run 8 定義延遲的資訊類 1class lazyitem 2 9 10public string key...
一種延遲方法呼叫的實現
原文 一種延遲方法呼叫的實現 需求場景 實現 定義任務介面 1inte ce itask 2 4 bool isrunning 5 void start 6 void stop 7 void run 8 定義延遲的資訊類 1class lazyitem 2 9 10public string key...
用NodeJs實現優先順序佇列PQueue
優先順序佇列 priorityqueue 是個很有用的資料結構,很多程式語言都有實現。nodejs是乙個比較新潮的伺服器語言,貌似還沒有提供相關類。這些天有用到優先順序佇列,因為時間很充足,閒來無事,就自己實現了一下。如下 script pqueue.js description 優先順序佇列類 a...