Страницы

Поиск по вопросам

четверг, 2 января 2020 г.

Как записать значение в переменную во время выполнения асинхронной функции JavaScript [дубликат]

#javascript


        
             
                
                    
                        
                            This question already has answers here:
                            
                        
                    
                
                        
                            Как вернуть значение из события или из функции обратного
вызова? Или хотя бы дождаться их окончания
                                
                                    (3 ответа)
                                
                        
                                Закрыт 1 год назад.
            
                    
Имеется метод

function user_info (login) {

    var info;

    this.pool.getConnection(function(err, connection) {
        if (err) throw err;
        connection.query('SELECT * FROM user WHERE login = ?', [login], function
(error, results, fields) {
            info = results;
            connection.release();

        });
    });

    return info;
}


В данном примере в info получаю undefined, тогда как в results записан объект(проверял
через дебаг)

Мне нужно вернуть методом user_info объект results, как это сделать?
Пробовал почти всё кроме промисов
    


Ответы

Ответ 1



function user_info (login, callback) { this.pool.getConnection(function(err, connection) { if (err) throw err; connection.query('SELECT * FROM user WHERE login = ?', [login], function (error, results, fields) { connection.release(); callback(results); }); }); } db.user_info(cookies.login, function(info){ /* code that uses user info */ });

Ответ 2



JS однопоточный, но не надо пытаться делать все по порядку: //Плохой подход для JS var данные; данные = запрашиваем_данные_из_далека(); обрабатываем_данные(данные); вместо этого на JS делается так: //Хороший подход для JS обрабатываем_данные(данные){ } запрашиваем_данные_из_далека(обрабатываем_данные); То есть не надо делать все при первом проходе (ждать данные). Указал функции для обратного вызова, вышел и ждешь. В вашем случае можно использовать Promise и async/await, но лучше, то что выполняется после: var data = user_info("Admin"); вынести в функцию обратного вызова (callback).

Ответ 3



Предлагаю вот такой вариант: import mysql from 'promise-mysql'; var mysqlConfig = { ... }; async function user_info (login) { try { var connection = await mysql.createConnection(mysqlConfig); var info = await connection.query(`SELECT * FROM user WHERE login="${ login }";`); connection.end(); return info; } catch (error) { throw error; } } Кстати, сохранил Ваш стиль, но заканчивайте уже использовать var)

Ответ 4



Кстати, если максимально использовать Ваш код, предлагаю такой вариант: function user_info (login) { var info = this.pool.getConnection(function(err, connection) { if (err) throw err; connection.query('SELECT * FROM user WHERE login = ?', [login], function (error, results, fields) { if (error) throw error; // здесь то тоже ошибку стоит обработать connection.release(); return results; // кстати, т.к. мы то знаем, что у нас только 1 пользователь с таким логином, // я бы сразу возвращал results[0] }); }); return info; }

Комментариев нет:

Отправить комментарий