VDT2
@VDT2
Java

Как корректно получить значения из вложенной функции при работе с mysql2?

Видимо под трехсотую строку кода в конец отупел... Стыдно спрашивать, но выхода не вижу. Изчитал и изучил уже по моему все что только можно. Не выходит "каменный цветок"...

var temp; // Объявил глобальную переменную

function getOnline(){                   //функция возврата int значения из базы данных.
    const sql = `SELECT * FROM Online`;
    connection.query(sql, function(err, results) {
        if(err) console.log(err);
        for(let i=0; i < results.length; i++){       // Перебираем полученный массив и забираем значение.
           temp=results[i].online;    // Получаем корректный результат
        }
    });
}
console.log(temp);    // 'undefined' не используемая переменная (как выдает IDE), см. скрин.


Блин как?
Вангую может быть дело в том, что ответ приходит чуть позже чем присваивается переменной. Либо дело во вложенной функции.
Во всех примерах и мануалах инета все описание заканчивается фразой...."И дальше работаем как с обычным массивом". А вот как теперь получить результат работы с "обычным массивом" ?
5f3a4c31b9a63880369123.png

Заранее ОГРОМНОЕ СПАСИБО!
p.s. Может чего толкового подскажите где посмотреть (почитать, послушать), чтобы в будущем не натыкаться на подобные проблемы )
  • Вопрос задан
  • 152 просмотра
Решения вопроса 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
"Работать как с обычным массивом" нужно внутри колбэка - асинхронный код синхронным не сделать. Есть промисы и async/await, но они принципиально сути не меняют.
Ответ написан
@legacy_js
Если актуален еще вопрос, можете воспользоваться в mysql2 методом .promise()
Пример Вашего кода
//  создаем пул
    const pool = mysql.createPool({
        connectionLimit : 100,
        host: "localhost",
        user: "root",
        database: "test",
        password: ""
    });

    let arr;

    const promisePool  = pool.promise(); 

    async function getOnline() {
        const sql = 'SELECT * FROM Online';

        const [rows, fields] = await promisePool.query(sql);

        for(let i=0; i < rows.length; i++){
           arr = rows[i].online; 
        }

        return arr;
    }

    getOnline().then(r => console.log(r)) // Вам не нужно выводить глобальную переменную, ответ выведется тут
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Alexandre888
@Alexandre888
Javascript-разработчик
вам нужно прочитать про области видимости переменных.
объявленная вами переменная temp, для console.log(temp) - undefined, т.к её значение изменяется внутри функции и доступно лишь там.
если вы хотите вывести изменённую temp, вы должны делать это в пределах функции:
var temp; 

function getOnline(){ 
    const sql = `SELECT * FROM Online`;
    connection.query(sql, function(err, results) {
        if(err) console.log(err);
        for(let i=0; i < results.length; i++){
           temp=results[i].online; 
        }
      console.log(temp) // здесь temp = results[i].online
    })
}
console.log(temp) // undefined, здесь temp не равняется ничему
getOnline();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы