【问题标题】:getting undefined variable in Nodejs在Nodejs中获取未定义的变量
【发布时间】:2015-12-29 05:38:24
【问题描述】:

我正在使用 Node 来运行这段代码

但是当我运行这段代码时,从 get 函数中的leadid 变量获取未定义的返回:

call = {};
call.hangup = {
    get: function(isOpen, ami, elastic, validator, growly, mysql, request){
        var self = call.hangup;
        this.isOpen = isOpen;
        this.ami = ami;
        this.elastic = elastic;
        this.validator = validator;
        this.growly = growly;
        this.mysql = mysql;
        this.request = request;
        if(isOpen)
        {
            ami.on('hangup', function(evt){
                var cause_status = parseInt(evt.cause);
                var message = self.causeStatus(cause_status);
                var channel = evt.channel;
                var isDAHDI = validator.contains(channel,"DAHDI");
                if((isDAHDI)&&(cause_status == 16)) 
                {

                    var mobile = evt.calleridnum;
                    if(validator.isLength(mobile,11))
                    {
                        if(validator.matches(mobile,/^09/i))
                        {   
                            var txtMessage = "";
                            var sending = "";
                            var leadid = self.searching(mobile, mysql, validator);

                           retrun leadid; ///  get the undefined !!!!


                        }
                    }
                }

            });
        }else {
            console.log("Hangup's Event is OFF !");
        }       
    },
searching: function(number, mysql, validator){
    this.number = number;
    this.mysql = mysql;
    this.validator = validator;
    var query = "{sql ...}";

    mysql.query(query, function(err, rows, fields) {        
    if (err) throw err; 
        if(!validator.isNull(rows))
        {               

            return rows[0].leadid;
        }else {
            return false;

        }
    });
},
};
module.exports = call;

这是我在主文件中的称呼:

var call = require('./call');
    call.hangup.get(true, ami, client, validator, growly, connection, request);

当我在主文件中调用这个函数(搜索)时

new call.hangup.searching(number, connection, validator);

正常工作

我该如何解决?

【问题讨论】:

  • 如果searchingcall.hangup 的一个方法,你为什么要做new self.searching?你在学习中错过了一些东西......
  • @MysterX 改变了它,但错误是一样的:/
  • 您是否能够解决您的问题/了解它为什么返回undefined
  • @pio 你的意思是什么?
  • 我试图建议,如果我的回答帮助您解决了您的问题,请接受答案。如果您没有设法解决问题,请跟进您的进度/您遇到的问题。

标签: javascript node.js


【解决方案1】:

您需要记住 JavaScript 是异步的。

searching 被调用时,数据库查询被异步发出,函数在数据库给你结果之前返回。换句话说,您的 searching 函数不会为您提供来自

的结果
function(err, rows, fields) {        
if (err) throw err; 
    if(!validator.isNull(rows))
    {               

        return rows[0].leadid;
    }else {
        return false;

    }
}

如你所愿,

   searching: function(number, mysql, validator){
    this.number = number;
    this.mysql = mysql;
    this.validator = validator;
    var query = "{sql ...}";

    mysql.query(query, function(err, rows, fields) {        
    if (err) throw err; 
        if(!validator.isNull(rows))
        {               

            return rows[0].leadid;
        }else {
            return false;

        }
    });
     --- > This is reached at the end of the call and nothing is returned },
    };

它没有明确返回任何东西,因此是 undefined

您应该使用promises 或传入searching 一个回调函数,该函数将在您的数据库查询返回时被调用。

所以你的解决方案应该是这样的:

get: function (...){
  ...
  self.searching(mobile, mysql, validator, whatIwantToDoAfterValidation)
},
searching: function(number, mysql, validator, callback){
   ...
   mysql.query(..., callback){
    if(!validator.isNull(rows))
    {               
        callback(rows[0].leadid);
    }else {
        callback(false);
    } 
   }
},
whatIwantToDoAfterValidation: function(leadid){
  ...do whatever you want with leadid...
}

看看jquery's promises 用promise做同样的事情。

【讨论】:

  • 你能给我一些例子或资源吗?
  • 我刚才问了similar question。您可以在 stackoverlow "javascript callbacks" 上找到详细的解释,例如 mozilla docs 或 google/search。
  • mozilla 文档可能不是最好的开始。
  • 我怎样才能用你的回答来处理这个例子?
  • 我认为最好将开发推迟几个小时并深入了解异步函数的工作原理。有很多资源,例如this。简而言之,我对上述短语的意思是:您不知道searching 中的query 何时找到您的验证所需的数据库记录。但是你想在它发生时做一些动作,所以你需要传入一个函数,以便在发生这种情况时调用。一开始异步语言可能有点难以理解。
猜你喜欢
  • 2019-10-18
  • 1970-01-01
  • 2018-06-29
  • 2017-08-03
  • 2016-09-27
  • 1970-01-01
  • 2023-03-14
  • 2018-05-29
  • 1970-01-01
相关资源
最近更新 更多