Я новичок в 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
1
oldtimer65 20 Дек 2019 в 18:46

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() для ожидания возвращенного значения.

0
Michael Rodriguez 20 Дек 2019 в 16:09

Как вы можете ясно видеть из console.log, все, что находится за пределами вашего запроса, выполняется первым.

Это то, что называется Asynchronous behavior. Это в основном означает, что вы не можете получить значения извне из функции, которая запускает Asynchronously, потому что Javascript / Node.js - это синхронные языки (одиночный поток), и он не ждет, пока вы async function завершат работу и {{X3} } любое значение, которое в данный момент хранится, по умолчанию это undefined

Люди часто запутываются в этом поведении, и вы, возможно, захотите понять, как Node.Js и асинхронные операции обрабатываются Цикл событий

0
Shivam Sood 20 Дек 2019 в 15:55