簡體   English   中英

Node.js類模塊系統

[英]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將引用全局對象( globalwindow )。

在你的情況下最好更換

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM