Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Непонятная аномалия (https://javascript.ru/forum/node-js-io-js/64283-neponyatnaya-anomaliya.html)

Elect 01.08.2016 01:23

Непонятная аномалия
 
Доброй ночи.
Возникла непонятная аномалия.
Следующая функция возвращает пустой массив,хотя я уверен,что результат sql-запроса не пустой,если делать лог внутри цикла,то там всё есть,но в массив видимо не ходит пизаться.
var getList = function(){
    var list = [];
    connection.query("SELECT * FROM list",function(err, result){
        for(var i in result){
            list.push(result[i]);
        }
    });
    return list;
}

Erolast 01.08.2016 07:25

Потому что асинхронщина.

Цитата:

в массив видимо не ходит пизаться
С какой бы стати ему не писаться? Просто ты возвращаешь list еще до того, как придет ответ от сервера. Как думаешь, почему в query нужно передавать коллбек, вместо того, чтобы напрямую получить результат? Запрос к базе данных - это запрос к сторонней программе, иногда даже на стороннем сервере, и еще неизвестно, когда от нее придет ответ (и придет ли вообще), поэтому нода поступает так - шлет запрос, записывает коллбек, который выполнится при ответе, и продолжает исполняться дальше. В твоем случае посылает запрос SELECT * FROM list и сразу же возвращает массив list, который на тот момент, естественно, пустой.
Изучай обещания - https://learn.javascript.ru/promise.

function getList() {
    return new Promise((resolve, reject) => {
        connection.query("SELECT * FROM list", (err, rows) => {
            resolve(rows);
        });
    });
}

// где-то в другом месте
getList().then((list) => {
    console.log(list);
});


Ну и да, если уж ты все равно на ноде - почему не используешь ES6? https://learn.javascript.ru/es-modern


Часовой пояс GMT +3, время: 04:03.