我需要从函数返回一个值,该函数从查询中获取其信息。我在将查询的匿名函数中的信息传递给容器函数时遇到了一些麻烦。
我尝试在更高的范围内创建一个数组(容器函数)并让查询函数按结果写入数组,但这似乎不起作用。我也尝试将数组传递给查询的匿名函数。这似乎也不起作用。
这是我的函数(在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()
返回它?
答案 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;
}