NodeJS запрашивает в MySQL возвращаемые значения в асинхронном режиме - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть задача, которая требует от меня сохранения данных, возвращенных из запроса SQL в список в JavaScript.Проблема, с которой я сталкиваюсь, заключается в асинхронной природе JavaScript (NodeJS).Запросы не выполняются в синхронном порядке, и, следовательно, точки данных не сохраняются в списке последовательно.Я пытался использовать обещания, но не повезло.Я довольно плохо знаком с JavaScript и застрял с этой проблемой около 12 часов.

Я пытался использовать обещания, async.waterfall и другие функции в модуле async, но ни одна из них не могла решить эту проблему.

query = "SELECT count(*) as users from tb"
query1 = "SELECT count(*) as collats from ct"


var list = [];
var user;
 conn.connect().then(function() {

    var req = new sql.Request(conn);

        req.query(query).then(function (data) {
        user = (data.d[0].users);

        list.push(user);
    })
    .catch(function (err) {
             console.log(err);
            conn.close();
        });   

    req.query(query1).then(function (data) {

        list.push(data.d[0].coll);
        conn.close();
        console.log("After closing second connection the value in list as of now is ",list[0],list[1]);
        **strong text**

    })
    .catch(function (err) {
             console.log(err);
            conn.close();
        });   

Ожидаемый результат должен быть: После закрытия второго соединениязначение в списке на данный момент составляет 334,23.// (334 = список [0] и 23 = список [1])

Фактический результат: иногда он совпадает с ожидаемым.Но в некоторых сценариях выводится «После закрытия второго соединения значение в списке на данный момент составляет 334, неопределенное»

Это из-за асинхронной природы Javascript.Как последовательно вставить элементы в список?

1 Ответ

0 голосов
/ 18 февраля 2019

Вот два фрагмента: первый выполняет первый запрос, затем второй запрос затем заканчивается.Второй выполняет оба запроса одновременно, ожидает их завершения и завершает.

Оба не проверены, но представляют собой общую идею о том, как решить условие вашей гонки и сделать ваш код детерминированным.

Цепочка then()

query = "SELECT count(*) as users from tb"
query1 = "SELECT count(*) as collats from ct"

var list = [];
var user;
conn.connect().then(function() {

    var req = new sql.Request(conn);

    req.query(query)
    .then(function (data) {
        user = (data.d[0].users);

        list.push(user);
        return req.query(query1);
    })
    .then(function(data){
        list.push(data.d[0].coll);
        conn.close();
        console.log("After closing second connection the value in list as of now is ",list[0],list[1]);
    })
    .catch(function (err) {
            console.log(err);
            conn.close();
    });   
});

Использование await и Promise.all ()

query = "SELECT count(*) as users from tb"
query1 = "SELECT count(*) as collats from ct"


var list = [];
var user;
conn.connect().then(async function() {

    var req = new sql.Request(conn);

    try{
        var [data1, data2] = await Promise.all([req.query(query), req.query(query1)]);
        list[0] = data1.d[0].users;
        list[1] = data2.d[0].coll;

        conn.close();
        console.log("After closing second connection the value in list as of now is ",list[0],list[1]);
    }catch(err){
        console.log("Error occured", err);
        conn.close();
    }

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...