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

标签 javascript mysql node.js asynchronous

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

我尝试过在 async 模块中使用 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 的异步特性。如何按顺序推送列表中的元素?

最佳答案

这里有两个片段,第一个片段执行第一个查询,然后第二个查询结束。第二个同时执行两个查询,等待它们完成,然后结束。

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

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

});

关于javascript - NodeJS 请求 mysql DB 以异步方式返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54752732/

相关文章:

forms - 当未给出 "title"属性时,工具提示 javascript 会破坏以下表单元素

javascript - 我怎样才能让我的默认属性数组访问我的插件中传递的 jQuery 对象?

MySql/Oracle 删除数字列的间隙

php - mysql查询返回每个结果的第一个匹配项

javascript - NodeJS 将 Base64 字符串转换为 jpeg 图像 - NodeJS 或 mysql

javascript - 如何: Control character count p tag with contenteditable ="true"?

javascript - 如何通过 Angular-Service 显示引导模式

java - Vaadin MySQL 获取

Node.js 异步模块需要

node.js - 判断预保存回调中是否有记录 "is new"