我是node.js的新手,但在编程方面却是老手。我从查询中获取值并将其放入数组中。这些值在数组创建过程中可用,但在外部不可用。控制台日志"new data“显示point有一个值。控制台日志点0显示未定义。这是我的代码。
var polygon = [-89.72,34.27,-89.46,34.53,-89.44,34.53,-89.43,34.52];
var point = [];
con.connect(function (err) {
console.log("Connected4 " + polygon);
var sql = 'select customer_num, latitude,longitude from gc.customers';
console.log("SQL = " + sql);
con.query(sql, function (err, rows, fields) {
if (err) throw err;
for (var i = 0; i < rows.length; i++) {
point[0] = rows[i].latitude;
point[1] = rows[i].longitude;
console.log("new row " + point[0] + " newpoint " + point[1]);
}
});
console.log("point0= ", point[0], "polygon0 = ", polygon[0])
const inside = require("point-in-polygon")(point, polygon)
console.log('inside = ' + inside)
});这是我的控制台日志
node junksql.js
Connected4 -89.72,34.27,-89.46,34.53,-89.44,34.53,-89.43,34.52
SQL = select customer_num, latitude,longitude from gc.customers
point0= undefined polygon0 = -89.72
inside= false point0= undefined vs0 = -89.72
inside = false
new row 28.406973 newpoint -81.57685
new row 28.406973 newpoint -81.57685
new row 28.472523 newpoint -81.473743
new row 28.406973 newpoint -81.57685
new row 28.406973 newpoint -81.57685
new row 28.406973 newpoint -81.57685
new row 28.472523 newpoint -81.473743
new row 28.472523 newpoint -81.473743
^C发布于 2019-12-21 00:00:26
它是未定义的,因为它在con.query的回调函数之外。这里发生的情况是,您的代码不会等待回调完成,所以当它到达con.query(sql, function (err, rows, fields) {行时,它将继续执行console.log("point0= ", point[0], "polygon0 = ", polygon[0],同时计算回调块。有几种方法可以解决这个问题。这里有一个实现Promise的修复。
const sqlQuery = (query) => {
return new Promise((resolve, reject) => {
con.query(query, function (err, rows, fields) {
if (err) return reject(err);
return resolve (rows);
});
});
};
const polygon = [-89.72,34.27,-89.46,34.53,-89.44,34.53,-89.43,34.52];
let point = [];
con.connect(function (err) {
sqlQuery('select customer_num, latitude,longitude from gc.customers')
.then(results => {
for (let i = 0; i < results.length; i++) {
//note: this is probably not the best logic
point[0] = results[i].latitude;
point[1] = results[i].longitude;
}
const shape = require("point-in-polygon")(point, polygon);
//do stuff with, or return, shape
})
.catch(err => {
//handle error
});
});请注意,循环遍历结果,但将值分配给point[0]和point[1]意味着如果有多个结果,则只会设置最后一对结果。根据您在这里期望发生的事情,有更好的方法来组织这一部分。
我在这里所做的关键更改是我用Promise包装了查询。这使我们能够确定在何处解决或拒绝promise中的逻辑。当promise返回时,您可以使用async/await对其进行await,也可以使用Promise.prototype.then()等待返回值。
发布于 2019-12-20 23:55:19
从您的console.log中可以清楚地看到,查询之外的所有内容都是首先运行的。
这就是所谓的Asynchronous behavior。这基本上意味着你不能从运行Asynchronously的函数获取外部值,因为Javascript/Node.js是同步语言(单线程),它不会等待你async function完成和console log它当前持有的任何值,默认情况下是undefined。
人们对这种行为经常感到困惑,您可能想了解Event Loop是如何处理Node.Js和异步内容的
https://stackoverflow.com/questions/59427948
复制相似问题