1

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'

私のコードの何が問題になっていますか?

4

2 に答える 2

6

オブジェクトのメソッドを直接呼び出す場合this、メソッド内でオブジェクトを参照しますが、それを引数として使用しようとするthisと、グローバルオブジェクト(globalまたはwindow)が参照されます。

あなたの場合は交換する方が良い

setTimeout(measure1.stop,100);

setTimeout(function() { measure1.stop(); }, 100);

動作の詳細:http this//bonsaiden.github.com/JavaScript-Garden/#function.this

于 2012-06-25T13:11:52.960 に答える
3

恐ろしいtimeout-switch-contextバグが再び発生します!thissetTimeoutによって呼び出された関数内のオブジェクトがそうではないために表示される内容が表示されますmeasure1-それはglobal(= window、このスクリプトがブラウザーで実行される場合)です。MDNの引用:

によって実行されるコードsetTimeout()は、呼び出された関数とは別の実行コンテキストで実行されます。結果として、this 呼び出された関数のキーワードはwindow(または)オブジェクトに設定され、呼び出した関数の値globalと同じにはなりません。thissetTimeout

ちなみに、確認は非常に簡単です。

stop: function() {
  var stopDate = new Date();
  if (! this.cb) { 
    console.log(this); 
  } // *Window*/_display...
}

...そして同様に修正するには:

setTimeout(function() { 
  measure1.stop(); 
}, 100);
于 2012-06-25T13:14:58.747 に答える