Я новичок в node.js, но опыт работы в программировании. Я получаю значения из запроса и помещаю их в массив. Значения доступны при создании массива, но не снаружи. Журнал консоли «новые данные» показывает, что точка [0] имеет значение. точка журнала консоли [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
2 ответа
Он не определен, потому что находится вне функции обратного вызова для con.query
. Здесь происходит то, что ваш код не будет ждать завершения обратного вызова, поэтому, когда он достигнет строки con.query(sql, function (err, rows, fields) {
, он перейдет к console.log("point0= ", point[0], "polygon0 = ", polygon[0]
, пока оценивается блок обратного вызова. Есть несколько способов обойти это. Вот одно исправление, которое реализует Обещание.
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]
означает, что если у вас есть несколько результатов, будет установлена только последняя пара. В зависимости от того, что вы ожидаете здесь, есть лучшие способы структурировать эту часть.
Ключевое изменение, которое я сделал здесь, - я обернул запрос Обещанием. Это позволяет нам определить, где именно решить или отклонить логику в обещании. Когда обещание возвращается, вы можете await
выполнить его с помощью async/await
или вы можете использовать Promise.prototype.then()
для ожидания возвращенного значения.
Как вы можете ясно видеть из console.log
, все, что находится за пределами вашего запроса, выполняется первым.
Это то, что называется Asynchronous behavior
. Это в основном означает, что вы не можете получить значения извне из функции, которая запускает Asynchronously
, потому что Javascript / Node.js - это синхронные языки (одиночный поток), и он не ждет, пока вы async function
завершат работу и {{X3} } любое значение, которое в данный момент хранится, по умолчанию это undefined
Люди часто запутываются в этом поведении, и вы, возможно, захотите понять, как Node.Js и асинхронные операции обрабатываются Цикл событий
Новые вопросы
mysql
MySQL - это бесплатная система управления реляционными базами данных с открытым исходным кодом (RDBMS), использующая язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. Д. Это разные БД, которые все используют свои собственные диалекты SQL для управления данными.