2014-09-30 54 views
0

現在我正在分析我的nodejs應用程序,以便查找每個方法調用和回調的持續時間。如何在Nodejs中爲回調創建代理對象

我已經寫一些代碼對代理的每個方法調用,比如:

function addPerfProxyUnderPrototype(name, clazz) { 
    var fn = clazz.prototype[name]; 
    clazz.prototype[name] = function() { 
     // var newArgs = getProxyArgs(arguments); 
     var s = new Date().getTime(); 
     // var result = fn.apply(this, newArgs); 
     var result = fn.apply(this, arguments); 
     var e = new Date().getTime(); 
     console.log('duration : ' + (e - s)); 
     return result; 
    }; 
}; 

我可以通過這些代碼獲取方法調用的持續時間。正如你可能知道的,在nodejs應用中,參數包含回調函數。 nodejs應用代碼如下:

var clazz = function(){ 
} 
clazz.prototype.send = function(callback){ 
    // do somthing 
    callback(err, data); 
} 

我想爲回調參數創建一個代理來獲得持續時間。

function getProxyArgs(args) { 
    var newArgs = []; 
    for (var i = 0; i < args.length; i++) { 
     var arg = args[i]; 
     if (typeof arg === 'function')) { 
      newArgs.push(function() { 
       var s = new Date().getTime(); 
       var result = arg.apply(undefined, arguments); 
       var e = new Date().getTime(); 
       console.log('duration : ' + (e - s)); 
       return result; 
      }); 
     } else { 
      newArgs.push(arg); 
     } 
    } 
    return newArgs; 
}; 

上面的代碼將失去'this'。任何想法如何解決這個問題?

回答

0
function getProxyArgs(args) { 
    var newArgs = []; 
    var self = this; 
    for (var i = 0; i < args.length; i++) { 
     var arg = args[i]; 
     if (typeof arg === 'function')) { 
      newArgs.push(function() { 
       var s = new Date().getTime(); 
       var result = arg.apply(self, arguments); 
       var e = new Date().getTime(); 
       console.log('duration : ' + (e - s)); 
       return result; 
      }); 
     } else { 
      newArgs.push(arg); 
     } 
    } 
    return newArgs; 
};