Я пытаюсь асинхронно извлечь данные из базы данных MySQL, а затем обработать результаты с обещанием Q (первая попытка). Я использую функцию Q defer(), указанную здесь. Я создал объект-оболочку, который я в конечном итоге прикреплю к req.db или получу доступ через круговую зависимость от com.db (как он используется в настоящее время), чтобы разрешить использование API в моем приложении.
Node выдает ошибку, указывающую на обратный вызов .then:
this.go().then(function(stuff){
^
TypeError: Cannot call method 'then' of undefined
Я пробовал следующее:
var com = require('./mainRebuild');
function Base() {
this.results = [];
this.query = 'query here';
this.go = function() {
com.pool.getConnection(function(err, con) {
if (err) throw err;
/*
THIS WORKS FINE (with callbacks)
con.query('SELECT * FROM Users', function(err, rows){
if (err) throw err;
if (rows){
for (var i = 0; i < rows.length; i++){
this.results.push(rows[i]);
//console.log(rows[i]);
}
}
con.release();
return this.results;
}.bind(this));
*/
var defer = com.Q.defer();
con.query('SELECT * FROM Users', defer.makeNodeResolver());
return defer.promise();
}.bind(this));
}
}
function DB() {
this.getAllUsers = function() {
this.query = 'SELECT * FROM Users';
this.go().then(function(stuff) {
console.log(stuff);
}, function(err) {
console.log(err);
});
}
}
DB.prototype = new Base();
module.exports = DB;
Объект com существует в основном приложении, он содержит все необходимые модули.
Я также пробовал (кажется гораздо более неправильным):
this.deffered = com.Q.defer();
com.pool.getConnection(function(err, con) {
if (err) this.deferred.reject(new Error(err));
con.query('SELECT * FROM Users', function(err, rows) {
if (err) throw err;
if (rows) {
this.deferred.resolve(rows);
}
con.release();
return this.deferred.promise.done;
}.bind(this));
com.Q.nfcall(this.go()).then...
Я нашел несколько статей об адаптации Q к узлу, таких как эта.
this.go
ничего не возвращает... - person elclanrs   schedule 27.02.2015go
, а не внутри обратного вызова. Вот упрощенный пример:function foo() { function bar() { return 42; }; bar(); }
. Вы действительно ожидаете, чтоfoo()
вернет42
? - person Felix Kling   schedule 27.02.2015return defer.promise();
Должно бытьreturn defer.promise;
- person Juan Mendes   schedule 27.02.2015defer.promise
. Кто-нибудь, пожалуйста, напишите ответ, и я приму его! Спасибо, парни! - person andrsnn   schedule 27.02.2015