草庐IT

关于 javascript:Q promise .then() undefined

codeneng 2023-03-28 原文

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() {
    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 对象存在于主应用程序中,它包含所有常见的 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) {
                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 不返回任何内容...
  • 我想我只是对我正在尝试编写的嵌套延迟函数感到困惑。你能解释一下如何让 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) {
    this.asyncQuery = function(sql) {
        return function () {
            var result = Q.defer(),
                paramsArray = [].slice.call(arguments);
            pool.getConnection(function(err, con) {
                if (err) return result.thenReject(err);
                con.query(sql, paramsArray, result.makeNodeResolver());
                result.promise.finally(function () {
                    con.release();
                });
            });
            return result.promise;
        };
    };
    this.getAllUsers = this.asyncQuery('SELECT * FROM Users');
    this.getUserByName = this.asyncQuery('SELECT * FROM Users WHERE name = ?');
}

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) {
    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);
});

  • 美丽的。将工厂函数添加到 module.exports 返回 new DB() 允许导出的对象完全可链接。 :D 例如module.exports = createApp; function createApp() { return new DB(); }
  • 另请参阅修改后的答案。 DB 的定义不需要知道 pool 是在 './mainRebuild' 中定义的。我们可以注入它。
  • 是否有理由不从 './mainRebuild' 导入依赖项?注射更可取,它如何优越?
  • 好吧,使用哪个连接与您的数据库适配器无关。您可以(理论上)拥有多个数据库或连接池,将池传递给 DB 构造函数允许该模式。
  • 很抱歉挖掘了那个线程,但我喜欢你模块化代码的方式,但是这样,连接不会被释放。不是很危险吗?
  • @krakig你是对的,当我写这个答案时我没有考虑到这一点。我添加了一个关闭连接的 finally 回调。

有关关于 javascript:Q promise .then() undefined的更多相关文章

  1. ruby-on-rails - Rails 中的 NoMethodError::MailersController#preview undefined method `activation_token=' for nil:NilClass - 2

    似乎无法为此找到有效的答案。我正在阅读Rails教程的第10章第10.1.2节,但似乎无法使邮件程序预览正常工作。我发现处理错误的所有答案都与教程的不同部分相关,我假设我犯的错误正盯着我的脸。我已经完成并将教程中的代码复制/粘贴到相关文件中,但到目前为止,我还看不出我输入的内容与教程中的内容有什么区别。到目前为止,建议是在函数定义中添加或删除参数user,但这并没有解决问题。触发错误的url是http://localhost:3000/rails/mailers/user_mailer/account_activation.http://localhost:3000/rails/mai

  2. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  3. ruby - "undefined method"用于 rails 模型 - 2

    我正在使用带有Rails的Devise,我想添加一个方法“getAllComments”,所以我这样写:classUser在我的Controller中:defdashboard@user=current_user@comments=@user.getAllComments();end当我访问我的url时,我得到了undefinedmethod`getAllComments'for#我做错了什么?谢谢 最佳答案 因为getAllComments是一个类方法,而您正试图将其作为实例方法访问。您要么需要访问它:User.getAllCom

  4. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  5. ruby-on-rails - 关于 Ruby 的一般问题 - 2

    我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia

  6. ruby-on-rails - Ruby "Undefined Method"用于类方法 - 2

    Ruby初学者努力简单地将这个@@people散列的值打印到控制台classPerson#haveafirst_nameandlast_nameattributewithpublicaccessorsattr_accessor:first_nameattr_accessor:last_name#haveaclassattributecalled`people`thatholdsanarrayofobjects@@people=[]#havean`initialize`methodtoinitializeeachinstancedefinitialize(first_name,last_

  7. ruby - Nokogiri:遇到 nil:NilClass 错误 "undefined method ‘text’” - 2

    我是程序员的新手,请原谅我的新手。所以我正在使用Nokogiri来抓取警方的犯罪记录。这是下面的代码:require'rubygems'require'nokogiri'require'open-uri'url="http://www.sfsu.edu/~upd/crimelog/index.html"doc=Nokogiri::HTML(open(url))putsdoc.at_css("title").textdoc.css(".brief").eachdo|brief|putsbrief.at_css("h3").textend我使用选择器小工具书签来查找日志(.brief)的C

  8. ruby-on-rails - "undefined method ` stub_request '"访问 RSpec 支持文件中的方法时 - 2

    我的Ruby-on-Rails项目中有以下文件结构,用于规范:/spec/msd/serviceservice_spec.rb/support/my_modulerequests_stubs.rb我的request_stubs.rb有:moduleMyModule::RequestsStubsmodule_functiondeflist_clientsurl="dummysite.com/clients"stub_request(:get,url).to_return(status:200,body:"clientsbody")endend在我的service_spec.rb我有:re

  9. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

  10. ruby - 在 Mechanize 中使用 JavaScript 单击链接 - 2

    我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan

随机推荐