我一直在努力获取一个输出数组的函数,但是我似乎没有做任何让我返回数组或在函数外部访问数组的事情。
我正在使用node.js和mysql,并试图提取行数据,对其进行修改,然后将其放入数组中。我似乎能够将其放入数组中,因为在函数中,我可以console.log记录将数组设置为的变量,并得到所需的内容。但是我无法将其排除在阵列之外。起初,我使用forEach()
,但后来改用map()
。
目前这是我在的位置
let sql = "SELECT invoice FROM subscriptions";
myFunction = () => {
con.query(sql, (err, rows) => {
if (err) throw err;
var newArray = rows.map((row) => {
return row.invoice;
})
console.log(newArray)
})
}
myFunction();
如果我将console.log(newArray)
更改为return newArray
,似乎没有证据表明这可以满足我的需求。
我也尝试过在函数外部定义变量,然后将newArray设置为函数外部的变量:
let sql = "SELECT invoice FROM subscriptions";
myArray = []
myFunction = () => {
con.query(sql, (err, rows) => {
if (err) throw err;
var newArray = rows.map((row) => {
return row.invoice;
})
myArray = newArray
})
}
myFunction();
console.log(myArray)
这只会导致[]
在此代码中,rows
从订阅表中返回发票编号。结果是:
[ '23480-13',
'23354-14',
'23728-14',
'23614-16',
'16132-14',
... more results ]
因此该功能内的console.log似乎是正确的。但是,据我所知,如果我尝试返回newArray
,则该函数未返回任何内容。
这似乎是一个简单的问题,但是我已经被困了几个小时了。如何创建一个函数,该函数将返回可以在新函数中使用的数组?
答案 0 :(得分:3)
这是回调驱动的代码,因此您必须提供一个回调函数才能正确链接:
function myFunction(cb) {
// Supply your query directly to query() so you don't accidentally
// send the wrong query by using an incorrect or undefined variable.
con.query("SELECT invoice FROM subscriptions", (err, rows) => {
// NOTE: This function runs at some point in the unspecified future,
// but you can request a callback when it's done.
if (err) throw err;
let newArray = rows.map((row) => {
return row.invoice;
})
cb(newArray);
})
}
myFunction(myArray => {
console.log(myArray);
});
没有正确的排序,JavaScript代码将无法在正确的时间运行。
请注意,使用Promises可以大大简化此类代码,因为您基本上可以这样做:
let myArray = await con.query(...);
答案 1 :(得分:1)
您可以使用@tadman建议的回调,但我建议您使用Promise
。使用 import pandas as pd
/* Convert the date column to Datetime format */
data['DATE'] = pd.to_datetime(data['DATE'])
/* Create mask for the required condition */
mask = data['DATE'] <= '31-12-2018'
/* apply mask to the data */
data = data.loc[mask]
允许其他功能使用await
调用此功能。
承诺版本:
Promise
如果您正在使用其他功能,则可以使用await来调用function myFunction() {
return new Promise(
(resolve, reject) => {
con.query("SELECT invoice FROM subscriptions", (err, rows) => {
if (err) {
reject(err);
}
resolve(rows.map(row => row.invoice));
})
}
);
}
myFunction().then(myArray => {
console.log(myArray);
});
:
myFunction