Javascript Js函数返回未定义

Javascript Js函数返回未定义,javascript,arrays,function,scope,return,Javascript,Arrays,Function,Scope,Return,我正在使用Node.js构建一个小型报告工具,我在使用Javascript时面临一些范围界定问题。我正在调用一个函数,它应该从数据库查询返回一个包含城市的数组。这里是函数 function queryBuilderZone () { var includedCities = new Array(); q = heredoc(function(){/* SELECT majlis.MajlisId FROM majlis WHERE majl

我正在使用Node.js构建一个小型报告工具,我在使用Javascript时面临一些范围界定问题。我正在调用一个函数,它应该从数据库查询返回一个包含城市的数组。这里是函数

function queryBuilderZone () {
  var includedCities = new Array();
  q = heredoc(function(){/*
        SELECT majlis.MajlisId
        FROM majlis
        WHERE majlis.ZoneId = -ZONE-
  */});
  q = q.replace(/-ZONE-/g, inZone);

  connection.query(q, function(err, rows, fields) {
        if (err) throw err;
        var rowsLentgh = rows.length;
        for (var i = 0; i < rowsLentgh; i++) {
              includedCities.unshift(rows[i].MajlisId);
        };
        console.log(includedCities); // <-- output correct: ['...', '....']
  });
  connection.end();
  console.log(includedCities); // <-- output wrong: []
  return includedCities;
}

这是我从主程序打来的电话

 includedCities = queryBuilderZone();
 console.log(includedCities); // <-- output wrong: []
问题在哪里?为什么此函数不返回数组includedCities中的元素? 并在connection.query的范围内显示正确的预期值


顺便说一下,我正在使用mysql模块构建查询并替换查询中的占位符。

这里发生的是返回和回调之间的区别。由于connection.query函数必须伸出手来获取其信息,queryBuilderZone函数在启动后将继续运行,然后得出结论,includedCities是空数组,因为此时它是空数组

您要做的是将回调传递给queryBuilderZone,如下所示

function queryBuilderZone(callback) {
    var includedCities = new Array();
    q = heredoc(function () {
        /*
        SELECT majlis.MajlisId
        FROM majlis
        WHERE majlis.ZoneId = -ZONE-
  */
    });
    q = q.replace(/-ZONE-/g, inZone);

    connection.query(q, function (err, rows, fields) {
        if (err) throw err;
        var rowsLentgh = rows.length;
        for (var i = 0; i < rowsLentgh; i++) {
            includedCities.unshift(rows[i].MajlisId);
        };
        console.log(includedCities); // <-- output correct: ['...', '....']
        callback(includedCities);
    });
    connection.end();
    console.log(includedCities); // <-- output wrong: []
    // return includedCities; Not needed
}
当你想利用它时,你会这样做

queryBuilderZone(function(includedCities) {
    // Do what you'd like here
    console.log(includedCities); // <-- output correct: ['...', '....']
});

回调函数中的任何内容都将在connection.query运行并吐出数组后执行

标准异步情况。您的错误控制台日志是否在回调完成之前出现?includeCities是函数的一个局部变量。在我看来,这是一个范围问题。我不是node.js人员,但includeCities是在queryBuilderZone函数中定义的,它不在全局范围内。将其移到函数上方的全局范围内。@rontornambe这是node.js初学者的一个非常典型的问题,他们没有时间阅读一个小教程。谢谢!我不知道回电话的事。因此,我只是想同时学习和解决这个问题。虽然我可以用其他语言解决它。如果您有任何关于回调的好教程,请毫不犹豫地分享: