我有一项任务,要求我将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的异步特性。如何按顺序推送列表中的元素?
答案 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();
});
});
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();
}
});