[英]Node.js Class Module System
我正在嘗試在node.js中創建模塊/類以測量異步執行時間,但不了解它的問題所在。 我創建了以下類“ Measure.js”
var Measure = module.exports = function(param_timeout, param_cb) {
this.timeout = param_timeout;
this.cb = param_cb;
}
Measure.prototype = {
startDate: "0",
timeout:"0",
cb:null,
start : function() {
this.startDate = new Date();
console.log('started');
},
stop : function() {
var stopDate = new Date();
this.cb(null,(stopDate-this.startDate));
}
}
我將其與以下代碼結合使用:
var Measure = require('./Measure.js');
measure1 = new Measure(100,function(err,result){console.log('result: ' + result)});
measure1.start();
//do something
measure1.stop();
而且效果很好。 但是,如果我嘗試這樣做:
var Measure = require('./Measure.js');
measure1 = new Measure(100,function(err,result){console.log('result: ' + result)});
measure1.start();
//do something
setTimeout(measure1.stop,100);
它不起作用並拋出TypeError:
TypeError: Object #<Object> has no method 'cb'
我的代碼有什么問題?
當您直接調用對象的方法時, this
方法內部的該對象是您的對象,但是當您嘗試將其用作參數時, this
將引用全局對象( global
或window
)。
在你的情況下最好更換
setTimeout(measure1.stop,100);
與
setTimeout(function() { measure1.stop(); }, 100);
有關this
行為的更多信息: http : //bonsaiden.github.com/JavaScript-Garden/#function.this
可怕的超時切換上下文錯誤再次出現! 您看到的是您看到的,因為setTimeout調用的函數中的this
對象不是measure1
它是global
(= window
,在瀏覽器中執行此腳本時)。 引用MDN :
setTimeout()
執行的代碼在與調用它的函數不同的執行上下文中運行。 結果,被調用函數的this
關鍵字將被設置為window
(或global
)對象,它將與名為setTimeout
的函數的this
值不同。
順便說一下,這很容易檢查:
stop: function() {
var stopDate = new Date();
if (! this.cb) {
console.log(this);
} // *Window*/_display...
}
...並進行修復:
setTimeout(function() {
measure1.stop();
}, 100);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.