Рассинхронизация времени исполнения кода с MySQL

Рейтинг: 1Ответов: 2Опубликовано: 03.10.2014

Есть функция, которая дергает информацию из базы..

function get_user_info(player_id)
{
    var info = [];
    var q1 = 'SELECT * FROM Users WHERE Login = '+player_id;
    e(q1);
    connection.query(q1, function(err, rows, fields) {
        if (err) throw err;

        info.gold = rows[0].Gold;
        info.right = rows[0].Right;
        e('Gold = '+info.gold+', Right = '+info.right);
        return info;
    });
    return info;
}

В определенный момент времени мы ее дергаем..

     var info = get_user_info(player_id);

Однако, в info запишется undefined, а запрос

connection.query(q1, function(err, rows, fields) {

сработает намного позднее.. Приблизительно разница в несколько миллисекунд

> Server running at port 1024
>         [3:33:0:15] Recived method=login, param=8284510
>         [3:33:0:15] SELECT * FROM Users WHERE Login = 8284510
>         [3:33:0:16] Send data={"method":"login_ok","params":"0"}
>         [3:33:0:68] Recived method=get_tables, param=0
>         [3:33:0:68] Send data={"method":"get_tables","params":[[]]}
>         [3:33:2:145] Recived method=create_table, param=Введите имя
> сервера
>         [3:33:2:145] ==> Recived command create_table..
>         [3:33:3:332] SELECT * FROM Users WHERE Login = 8284510
>         [3:33:3:334] undefined!!!! undefined
>         [3:33:3:334] SELECT * FROM Users WHERE Login = 8284510
>         [3:33:3:335] Send data={"method":"update_table","params":[[{"player":"8284510","passive":0,"light":true,"disco":false,"music":""},{"id":"8284510","seat":0}]]}
>         [3:33:3:335] ==> End command create_table..
>         [3:33:3:335] Gold = 3415, Right = 1001
>         [3:33:3:335] Gold = 3415, Right = 1001

Как заставить их синхронизировать? while(answer) не предлагать. =) Такое ощущение, что у event просто приоритет другой.

Ответы

▲ 0Принят

Самый лучший вариант - это, конечно, калбеки. Но с ними больше проблем.
Я сделал вот что:

function update_local_db(player_id)
{
    var q1 = 'SELECT * FROM Users WHERE Login = '+player_id;
    e(q1);
    connection.query(q1, function(err, rows, fields) {
        if (err) throw err;

        var obj = [];
        obj = {gold:rows[0].Gold, right:rows[0].Right};
        db[player_id]=obj;
        e('Added player = '+player_id+' in local DB, gold = '+db[player_id].gold+', right = '+db[player_id].right);
    });
}

По команде login (пользователь вошел в игру), в самом начале обновляю данные по нему в local_db. Затем просто беру нужные мне данные без задержек из локальной db.

function get_user_info(player_id)
{
    var info = [];

    info.gold = db[player_id].gold;
    info.right = db[player_id].right;

    return info;
}

А вот изменения в самой базе данных делаю в реальной БД. И по калбеку делаю update local copy. Мне кажется, это тоже неплохой вариант, если речь об игре. Так как сервер долго грузится, но потом экономит на скорости работы.

▲ 2

Это результат работы ансинхронного запроса, все правильно. Или перенесите логику в результат обработки запроса, или оберните запрос в коллбэк:

function get_user_info(player_id, callback)
{
    var info = [];
    var q1 = 'SELECT * FROM Users WHERE Login = '+player_id;
    e(q1);
    connection.query(q1, function(err, rows, fields) {
        if (err) throw err;

        info.gold = rows[0].Gold;
        info.right = rows[0].Right;
        e('Gold = '+info.gold+', Right = '+info.right);
        callback(info);
    });
}

вызов:

var info;
get_user_info(player_id, function(data){
    info = data;
});