NodeJS对mysql DB的请求以异步方式返回值

时间:2019-02-18 17:45:24

标签: javascript mysql node.js asynchronous

我有一项任务,要求我将SQL查询返回的数据存储到JavaScript列表中。我面临的问题是JavaScript(NodeJS)的异步特性。查询不是以同步顺序执行的,因此,数据点不会以顺序的方式存储在列表中。我尝试使用诺言,但没有运气。我对JavaScript相当陌生,并且在大约12个小时的时间内一直遇到这个问题。

我尝试过在异步模块中使用Promise,async.waterfall和其他功能,但是没有一个可以解决这个问题。

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 :(得分:1)

这是两个片段,第一个片段首先进行查询,然后第二个查询然后结束。第二个查询同时执行两个查询,等待它们完成并结束。

这两个都是未经测试的,但都是解决竞态条件和使代码具有确定性的总体思路。

束缚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();
    }

});