最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

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

IT培训 admin 9浏览 0评论

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

我有一个任务,要求我将从SQL查询返回的数据存储到JavaScript中的列表中。我面临的问题是JavaScript(NodeJS)的异步特性。查询不是以同步顺序执行的,因此,数据点不会以顺序方式存储在列表中。我尝试过使用承诺,但没有运气。我对JavaScript很陌生,现在已经坚持了大约12个小时。

我已经尝试在异步模块中使用promises,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 = list [0]和23 = list [1])

实际输出:有时与预期相同。但在某些情况下,它打印“在关闭第二个连接后,列表中的值到现在为334,未定义”

这是因为Javascript的异步性质。如何以顺序方式推送列表中的元素?

回答如下:

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

两者都未经过测试,但是关于如何解决竞争条件并确保代码具有确定性的一般想法。

链接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();
    }

});

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

我有一个任务,要求我将从SQL查询返回的数据存储到JavaScript中的列表中。我面临的问题是JavaScript(NodeJS)的异步特性。查询不是以同步顺序执行的,因此,数据点不会以顺序方式存储在列表中。我尝试过使用承诺,但没有运气。我对JavaScript很陌生,现在已经坚持了大约12个小时。

我已经尝试在异步模块中使用promises,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 = list [0]和23 = list [1])

实际输出:有时与预期相同。但在某些情况下,它打印“在关闭第二个连接后,列表中的值到现在为334,未定义”

这是因为Javascript的异步性质。如何以顺序方式推送列表中的元素?

回答如下:

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

两者都未经过测试,但是关于如何解决竞争条件并确保代码具有确定性的一般想法。

链接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();
    }

});
发布评论

评论列表 (0)

  1. 暂无评论