Q promise .then() undefined
我正在尝试从 MySQL 数据库中异步提取数据,然后使用 Q Promise 处理结果(有史以来第一次尝试)。我正在使用此处列出的 Q defer() 函数。我创建了一个 “wrapper” 对象,我最终将附加到 req.db 或通过来自 com.db 的循环依赖项访问(当前使用方式),以允许在我的应用程序中使用 api。
节点抛出指向 .then 回调的错误:
1
2 3 |
this.go().then(function(stuff){
^ TypeError: Cannot call method ‘then’ of undefined |
我尝试了以下方法:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
var com = require(‘./mainRebuild’);
function Base() { com.pool.getConnection(function(err, con) { if (err) throw err; for (var i = 0; i < rows.length; i++){ */ function DB() { } DB.prototype = new Base(); module.exports = DB; |
com 对象存在于主应用程序中,它包含所有常见的 require 模块。
我也试过了(好像错多了):
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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) { com.Q.nfcall(this.go()).then… |
我找到了几篇关于像这样将 Q 适配到节点的文章。
- this.go 不返回任何内容…
- 我想我只是对我正在尝试编写的嵌套延迟函数感到困惑。你能解释一下如何让 this.go 返回嵌套的延迟吗?
- 在 go 中创建Promise,而不是在回调中。这是一个简化的示例: function foo() { function bar() { return 42; }; bar(); } 。你希望 foo() 真的返回 42 吗?
- return defer.promise(); 应该是 return defer.promise;
- 是的,将 defer 放在回调之外,然后在 foo 中返回,效果很好。还有 defer.promise。有人请写下答案,我会接受的!多谢你们!
- 对于未来的观众,这个例子有很大帮助:gist.github.com/jeffcogswell/8257755
应该这样做(“应该”,因为我无法用 MySQL 测试它)
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
var Q = require(‘Q’);
function DB(pool) { module.exports = DB; |
用法:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
var DB = require(‘./DB’);
var com = require(‘./mainRebuild’); var db = new DB(com.pool); db.getAllUsers().then(function (users) { db.getUserByName(‘JohnDoe’).then(function (user) { var customQuery = db.asyncQuery(‘SELECT * FROM foo WHERE id = ?’); |
- 美丽的。将工厂函数添加到 module.exports 返回 new DB() 允许导出的对象完全可链接。 :D 例如module.exports = createApp; function createApp() { return new DB(); }
- 另请参阅修改后的答案。 DB 的定义不需要知道 pool 是在 ‘./mainRebuild’ 中定义的。我们可以注入它。
- 是否有理由不从 ‘./mainRebuild’ 导入依赖项?注射更可取,它如何优越?
- 好吧,使用哪个连接与您的数据库适配器无关。您可以(理论上)拥有多个数据库或连接池,将池传递给 DB 构造函数允许该模式。
- 很抱歉挖掘了那个线程,但我喜欢你模块化代码的方式,但是这样,连接不会被释放。不是很危险吗?
- @krakig你是对的,当我写这个答案时我没有考虑到这一点。我添加了一个关闭连接的 finally 回调。
来源:https://www.codenong.com/28757256/