2016-01-26 65 views
0

我想使用方法,另一種方法在同一類calc下從數據庫如下但是我有些數據只得到 錯誤的Node.js - 如何使用方法,另一種方法

[TypeError: Object #<Query> has no method 'methodMaxLct']" 
exports.UserClass = function() { 
this.methodMaxLct = function(lct, callback) { 
    var counting = Math.ceil(Math.pow(1.15, (lct - 1)) * 10) * 10; 
    callback(counting); 
    this.methodGetData = function(idu, callback) { 
    connection = mysql.createConnection(dbconfig); 
    connection.query(dataUserResources, [idu], function(err, results, fields) { 
     if (err) throw err; 
     if (results.length == 0) { 
     callback = 0; 
     } else { 
     for (var i in results) { 
      var dataU = results[i]; 
     } 
     dataU.enMax = 30; 
     var ap = this.methodMaxLct(dataU.lct, function(answer) { 
      dataU.lctMax = answer; 
     }); 
     callback(dataU); 
     } 
     connection.end(); 
    }); 
    }; 
}; 

任何人都可以給我一個提示或相同的線索如何以正確的方式做到這一點?

+0

'這'不是你認爲它是在一個回調函數裏面......在你的函數的頂部,把'var self = this;'然後用'self'代替'this' –

回答

5

試試吧。您必須將這個對象存儲到一個變量中,以便您可以在內部函數中使用它。基於執行上下文,this是不同的。

exports.UserClass = function() { 
var self = this; 
this.methodMaxLct = function(lct, callback) { 
    var counting = Math.ceil(Math.pow(1.15, (lct - 1)) * 10) * 10; 
    callback(counting); 
    this.methodGetData = function(idu, callback) { 
    connection = mysql.createConnection(dbconfig); 
    connection.query(dataUserResources, [idu], function(err, results, fields) { 
     if (err) throw err; 
     if (results.length == 0) { 
     callback = 0; 
     } else { 
     for (var i in results) { 
      var dataU = results[i]; 
     } 
     dataU.enMax = 30; 
     var ap = self.methodMaxLct(dataU.lct, function(answer) { 
      dataU.lctMax = answer; 
     }); 
     callback(dataU); 
     } 
     connection.end(); 
    }); 
    }; 
}; 
+0

謝謝。有用。 – Estherius

1

回調函數的上下文(this)是在調用回調函數時確定的。所以,你應該使用箭頭功能或.bind(本)

使用箭頭功能

exports.UserClass = function() { 
this.methodMaxLct = function(lct, callback) { 
    var counting = Math.ceil(Math.pow(1.15, (lct - 1)) * 10) * 10; 
    callback(counting); 
    this.methodGetData = function(idu, callback) { 
    connection = mysql.createConnection(dbconfig); 
    // use arrow function 
    connection.query(dataUserResources, [idu], (err, results, fields) => { 
     if (err) throw err; 
     if (results.length == 0) { 
     callback = 0; 
     } else { 
     for (var i in results) { 
      var dataU = results[i]; 
     } 
     dataU.enMax = 30; 
     var ap = this.methodMaxLct(dataU.lct, function(answer) { 
      dataU.lctMax = answer; 
     }); 
     callback(dataU); 
     } 
     connection.end(); 
    }); 
    }; 
}; 

使用.bind(...)方法

exports.UserClass = function() { 
this.methodMaxLct = function(lct, callback) { 
    var counting = Math.ceil(Math.pow(1.15, (lct - 1)) * 10) * 10; 
    callback(counting); 
    this.methodGetData = function(idu, callback) { 
    connection = mysql.createConnection(dbconfig); 
    connection.query(dataUserResources, [idu], function(err, results, fields) { 
     if (err) throw err; 
     if (results.length == 0) { 
     callback = 0; 
     } else { 
     for (var i in results) { 
      var dataU = results[i]; 
     } 
     dataU.enMax = 30; 
     var ap = this.methodMaxLct(dataU.lct, function(answer) { 
      dataU.lctMax = answer; 
     }); 
     callback(dataU); 
     } 
     connection.end(); 
    }.bind(this)); 
    }; 
}; 
相關問題