Js函数返回undefined

时间:2013-12-21 21:30:49

标签: javascript arrays function scope return

我正在使用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模块构建查询并替换查询中的占位符。

1 个答案:

答案 0 :(得分:3)

这里发生的是返回和回调之间的区别。由于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运行之后执行,并吐出数组。