Javascript 修改NodeJS中嵌套查询的结果
对NodeJS很幼稚,并试图找出一种方法,将第二个表中的结果添加到节点js中第一个表的结果集中 如何在第二个查询中访问第一个查询的结果 下面是我的代码片段和注释Javascript 修改NodeJS中嵌套查询的结果,javascript,node.js,Javascript,Node.js,对NodeJS很幼稚,并试图找出一种方法,将第二个表中的结果添加到节点js中第一个表的结果集中 如何在第二个查询中访问第一个查询的结果 下面是我的代码片段和注释 function getTasks(callback) { //first query gives result set connection.query('SELECT * FROM ' + properties.get('database.Table') +' order by timestamp desc', function(e
function getTasks(callback) {
//first query gives result set
connection.query('SELECT * FROM ' + properties.get('database.Table') +' order by timestamp desc', function(err, rows){
if(!err){
//for each result from result set, match on Id and get values from table_2
for (var i = rows.length - 1; i >= 0; i--) {
connection.query('SELECT * FROM table_2 where taskId = "' + rows[i].taskId + '"', function(err, sets){
if(!err){
//if we have any results from table_2 then create an object
if(sets.length > 0){
var setStatus = [];
for (var i = sets.length - 1; i >= 0; i--) {
setStatus[i] = {Status : sets[i].type+'-'+sets[i].status};
}
//add the setStaus object to results from first table (to rows)
//ISSUE: accessing rows[i] here is alwyas undefined??
}
}
});
}
//need to send the rows with updates from nested block
callback(rows);
}
});
更新:通过将内部迭代器的i改为j,异步/等待解决方案成功了 第二个for循环中
i
的声明覆盖了第一个循环中i
的值
您可以通过将作为第二个循环的一部分声明的变量更改为除
i
之外的其他变量来解决此问题。第二个for循环中i
的声明将覆盖第一个循环中i
的值
您可以通过将声明为第二个循环的一部分的变量更改为除
i
之外的其他变量来解决此问题。您可以使用async/await来处理此问题
const execute = (query) => {
return new Promise((resove, reject) => {
connection.query(query,
function (err, rows) {
if (err) reject(err);
resove(rows);
});
});
}
const getTasks = async () => {
const query = 'SELECT * FROM ' + properties.get('database.Table') + ' order by timestamp desc';
const rows = await execute(query);
for (var i = rows.length - 1; i >= 0; i--) {
const innerQuery = 'SELECT * FROM table_2 where taskId = "' + rows[i].taskId + '"';
const sets = await execute(innerQuery);
//Do some stuff
if (sets.length > 0) {
var setStatus = [];
for (var i = sets.length - 1; i >= 0; i--) {
setStatus[i] = {
Status: sets[i].type + '-' + sets[i].status
};
}
}
}
return rows;
};
Yau可以在内部等待或在下面给出
getTasks().then((rows) => {
console.log(rows);
}).catch((err) => {
console.log(err);
})
您可以使用async/await处理
const execute = (query) => {
return new Promise((resove, reject) => {
connection.query(query,
function (err, rows) {
if (err) reject(err);
resove(rows);
});
});
}
const getTasks = async () => {
const query = 'SELECT * FROM ' + properties.get('database.Table') + ' order by timestamp desc';
const rows = await execute(query);
for (var i = rows.length - 1; i >= 0; i--) {
const innerQuery = 'SELECT * FROM table_2 where taskId = "' + rows[i].taskId + '"';
const sets = await execute(innerQuery);
//Do some stuff
if (sets.length > 0) {
var setStatus = [];
for (var i = sets.length - 1; i >= 0; i--) {
setStatus[i] = {
Status: sets[i].type + '-' + sets[i].status
};
}
}
}
return rows;
};
Yau可以在内部等待或在下面给出
getTasks().then((rows) => {
console.log(rows);
}).catch((err) => {
console.log(err);
})
尝试使用
let
或const
而不是var
。对所有迭代器使用不同于i
的变量名。这可能会弄乱您的第一个i
,从而导致行[i]
成为未定义的
您可能还想寻找一个支持ES6承诺的MySQL节点模块,比如:尝试使用let
或const
而不是var
。对所有迭代器使用不同于i
的变量名。这可能会弄乱您的第一个i
,从而导致行[i]
成为未定义的
您可能还想寻找一个支持ES6承诺的MySQL节点模块,如下所示:use async/await for async call.use async/await for async call。