Javascript Q promise.then()未定义
我尝试从MySQL数据库异步提取数据,然后使用Q promise处理结果(有史以来第一次尝试)。我正在使用列出的Q defer()函数。我已经创建了一个“包装器”对象,我将最终附加到req.db,或者通过com.db的循环依赖项访问(当前的使用方式),以便在我的应用程序中使用api 节点抛出指向的错误。然后回调:Javascript Q promise.then()未定义,javascript,node.js,q,Javascript,Node.js,Q,我尝试从MySQL数据库异步提取数据,然后使用Q promise处理结果(有史以来第一次尝试)。我正在使用列出的Q defer()函数。我已经创建了一个“包装器”对象,我将最终附加到req.db,或者通过com.db的循环依赖项访问(当前的使用方式),以便在我的应用程序中使用api 节点抛出指向的错误。然后回调: this.go().then(function(stuff){ ^ TypeError: Cannot call method 't
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;
我发现了几篇关于将Q调整为节点的文章,比如。类似这样的东西应该可以做到(“应该”,因为我没有办法用MySQL测试它) 用法:
var DB = require('./DB');
var com = require('./mainRebuild');
var db = new DB(com.pool);
db.getAllUsers().then(function (users) {
console.log(users);
});
db.getUserByName('JohnDoe').then(function (user) {
console.log(user);
});
var customQuery = db.asyncQuery('SELECT * FROM foo WHERE id = ?');
customQuery(42).then(function (result) {
console.log(result);
});
像这样的东西应该可以做到(“应该”,因为我没有办法用MySQL测试它) 用法:
var DB = require('./DB');
var com = require('./mainRebuild');
var db = new DB(com.pool);
db.getAllUsers().then(function (users) {
console.log(users);
});
db.getUserByName('JohnDoe').then(function (user) {
console.log(user);
});
var customQuery = db.asyncQuery('SELECT * FROM foo WHERE id = ?');
customQuery(42).then(function (result) {
console.log(result);
});
像这样的东西应该可以做到(“应该”,因为我没有办法用MySQL测试它) 用法:
var DB = require('./DB');
var com = require('./mainRebuild');
var db = new DB(com.pool);
db.getAllUsers().then(function (users) {
console.log(users);
});
db.getUserByName('JohnDoe').then(function (user) {
console.log(user);
});
var customQuery = db.asyncQuery('SELECT * FROM foo WHERE id = ?');
customQuery(42).then(function (result) {
console.log(result);
});
像这样的东西应该可以做到(“应该”,因为我没有办法用MySQL测试它) 用法:
var DB = require('./DB');
var com = require('./mainRebuild');
var db = new DB(com.pool);
db.getAllUsers().then(function (users) {
console.log(users);
});
db.getUserByName('JohnDoe').then(function (user) {
console.log(user);
});
var customQuery = db.asyncQuery('SELECT * FROM foo WHERE id = ?');
customQuery(42).then(function (result) {
console.log(result);
});
this.go
没有返回任何东西……我想我只是对我试图编写的嵌套延迟函数感到困惑。您能解释一下如何使这个.go返回嵌套的延迟吗?在go
中创建承诺,而不是在回调中创建承诺。下面是一个简化的示例:函数foo(){function bar(){return 42;};bar();}
。你希望foo()
真的返回42
?返回defer.promise()
应该是返回defer.promise代码>是的,将defer放在回调之外,然后返回foo,效果非常好。还有延迟.承诺
。有人请写下答案,我会接受的!谢谢大家this.go
不会返回任何东西……我想我只是对我试图编写的嵌套延迟函数感到困惑。您能解释一下如何使这个.go返回嵌套的延迟吗?在go
中创建承诺,而不是在回调中创建承诺。下面是一个简化的示例:函数foo(){function bar(){return 42;};bar();}
。你希望foo()
真的返回42
?返回defer.promise()
应该是返回defer.promise代码>是的,将defer放在回调之外,然后返回foo,效果非常好。还有延迟.承诺
。有人请写下答案,我会接受的!谢谢大家this.go
不会返回任何东西……我想我只是对我试图编写的嵌套延迟函数感到困惑。您能解释一下如何使这个.go返回嵌套的延迟吗?在go
中创建承诺,而不是在回调中创建承诺。下面是一个简化的示例:函数foo(){function bar(){return 42;};bar();}
。你希望foo()
真的返回42
?返回defer.promise()
应该是返回defer.promise代码>是的,将defer放在回调之外,然后返回foo,效果非常好。还有延迟.承诺
。有人请写下答案,我会接受的!谢谢大家this.go
不会返回任何东西……我想我只是对我试图编写的嵌套延迟函数感到困惑。您能解释一下如何使这个.go返回嵌套的延迟吗?在go
中创建承诺,而不是在回调中创建承诺。下面是一个简化的示例:函数foo(){function bar(){return 42;};bar();}
。你希望foo()
真的返回42
?返回defer.promise()
应该是返回defer.promise代码>是的,将defer放在回调之外,然后返回foo,效果非常好。还有延迟.承诺
。有人请写下答案,我会接受的!谢谢大家!美丽的。将工厂函数添加到module.exports并返回新的DB()允许导出的对象完全可链接:D.g.module.exports=createApp;函数createApp(){return new DB();}
另请参见修改后的答案。DB
的定义不需要知道pool
是在'./mainRebuild'
中定义的。我们可以注入它。有没有理由不从'./mainRebuild'
导入依赖项?注入是否更可取,它的优越性如何?好吧,使用哪种连接与您的DB适配器无关。理论上,您可以拥有多个数据库或连接池,将池传递给DB构造函数允许这种模式。这不是很危险吗?很漂亮。将工厂函数添加到module.exports并返回新的DB()允许导出的对象完全可链接:D.g.module.exports=createApp;函数createApp(){return new DB();}
另请参见修改后的答案。DB
的定义不需要知道pool
是在'./mainRebuild'
中定义的。我们可以注入它。有没有理由不从'./mainRebuild'
导入依赖项?注入是否更可取,它的优越性如何?好吧,使用哪种连接与您的DB适配器无关。理论上,您可以拥有多个数据库或连接池,将池传递给DB构造函数允许这种模式。这不是很危险吗?很漂亮。将工厂函数添加到module.exports并返回新的DB()允许导出的对象完全可链接:D.g.module.exports=createApp;函数createApp(){return new DB();}
另请参见修改后的答案。DB
的定义不需要知道pool
是在'./mainRebuild'
中定义的。我们可以注入它。有没有理由不从'./mainRebuild'
导入依赖项?注入更可取吗,它有多优越?好吧,这不是你的DB适配器的共同点