从查询的匿名函数中写入更高范围的数组

时间:2014-03-24 23:48:34

标签: javascript node.js function scope node-mysql

我需要从函数返回一个值,该函数从查询中获取其信息。我在将查询的匿名函数中的信息传递给容器函数时遇到了一些麻烦。

我尝试在更高的范围内创建一个数组(容器函数)并让查询函数按结果写入数组,但这似乎不起作用。我也尝试将数组传递给查询的匿名函数。这似乎也不起作用。


这是我的函数(在Node中执行):

function retrieveSales(connection,timeFrame) {

    var sales = new Array();

    connection.query('select * from sales_entries where date BETWEEN ? AND ?',
    timeFrame,

    function (err, rows, fields, sales) {

        if (err) return callback(new Error('Failed to connect'), null);

        connection.end();

        for (x = 0; x < rows.length; x++) {
            sales.push(rows[x]);
        }

    });

    console.log('Sales Returned: ' + JSON.stringify(sales, null, 4));

    return sales;

}

导致'cannot call method 'push' of undefined

我应该如何正确地写入sales数组,以便我可以使用retrieveSales()返回它?

2 个答案:

答案 0 :(得分:0)

您正在处理JavaScript的美丽asynchronous-ness-icity。您正试图退出异步方法。试着了解异步编程的工作原理,它会让你的生活更轻松,更轻松;它不是很难,只是不同。看看这个代码示例,希望它可以让你起作用。

// use this as your callback to handle the results from connection.query()
function sales_cb(rows) {
  var sales = [];
  for (x = 0; x < rows.length; x++) {
    sales.push(rows[x]);
  }
  console.log('Sales Returned: ' + JSON.stringify(sales, null, 4));
}

function retrieveSales(connection, timeFrame) {
  // connection.query() is asynchronous - interact with it accordingly
  connection.query('select * from sales_entries where date BETWEEN ? AND ?', timeFrame,
    function (err, rows, fields, sales) {
      if (err) {
        callback(new Error('Failed to connect'), null);
      } else {
        // invoke sales_cb(sales) once the for loop is done
        sales_cb(rows);
      }
    });
}

请告诉我这是否有帮助:)

答案 1 :(得分:0)

使用:

https://github.com/kriskowal/q

以下是如何做到这一点:

var q = require('q');


function retrieveSales(connection,timeFrame) {

  var sales = new Array();
  var deferred = q.defer();

  connection.query('select * from sales_entries where date BETWEEN ? AND ?',
     timeFrame,

     function (err, rows, fields) {

     if (err) return callback(new Error('Failed to connect'), null);

     connection.end();

      for (x = 0; x < rows.length; x++) {
          sales.push(rows[x]);
      }

      deferred.resolve(sales);
  });

  deferred.then(function(salesback) {
    console.log('Sales Returned: ' + JSON.stringify(salesback, null, 4));
  }

  // added bonus -- the calling function can also use the promise
  return deferred;

}

更多信息:http://howtonode.org/promises