gpt4 book ai didi

javascript - 如何使 for 循环迭代从数据库结果添加到数组的附加元素?

转载 作者:行者123 更新时间:2023-12-01 01:19:05 25 4
gpt4 key购买 nike

我有一个数组。我想用每个数组元素查询 mysql 数据库,并且在满足特定条件时,我想向同一个数组添加其他元素并迭代这些元素。

我是 Nodejs 新手,所以我不知道这是否是正确的方法。

我提供了一个代码片段,它是我的问题的简化版本。

在下面的代码片段中,我想在控制台上显示“看起来不错”。

pre_req_subjects_arr = [2310,2320,2410];
for(let j=0;j<pre_req_subjects_arr.length;j++) {
console.log("j is : "+j);
db.query("SELECT `NUMBER` FROM `COURSE`",function(err,preOfPreReq) {
if(err) {
console.log("Error while creating array of pre_req subjects : " + err);
} else {
console.log("j inside db query : "+j);
if(j==1) {
pre_req_subjects_arr.push(1111);
}
if(pre_req_subjects_arr[j] == 1111) {
console.log("looks good");
}
}
})
}

setTimeout(function() {
console.log("pre_req_subjects_arr is " + JSON.stringify(pre_req_subjects_arr));
}, 1000);

输出:

j is : 0
j is : 1
j is : 2


j inside db query : 0
j inside db query : 1
j inside db query : 2



pre_req_subject_arr : [2310,2320,2410,1111]

预期输出:

j is : 0
j is : 1
j is : 2
j is : 3

j inside db query : 0
j inside db query : 1
j inside db query : 2
j inside db query : 3

looks good
pre_req_subject_arr : [2310,2320,2410,1111]

最佳答案

由于您的数据库 API 是异步的,因此您的 for 循环将在任何 db.query 回调执行之前完成。因此,当您push到那里时,对于for循环来说已经太晚了——它已经退出了。

您应该研究 Promise,并且您的数据库 API 可能支持 Promise。在这种情况下,请使用该功能。但从评论中我了解到您使用 mysql package没有 Promise 支持。

原则(有或没有 promise )是等待每个查询完成,然后再继续下一个“迭代”。您需要某种异步循环方式来实现这一点。例如,您可以使用此功能:

var pre_req_subjects_arr = [2310,2320,2410];

(function loop(j) {
if (j >= pre_req_subjects_arr.length) { // all "iterations" done!
console.log("pre_req_subjects_arr is " + JSON.stringify(pre_req_subjects_arr));
return;
}
console.log("j is : "+j);

db.query("SELECT `NUMBER` FROM `COURSE`",function(err,preOfPreReq) {
if(err) {
console.log("Error while creating array of pre_req subjects : " + err);
} else {
console.log("j inside db query : "+j);
if(j==1) {
pre_req_subjects_arr.push(1111);
}
if(pre_req_subjects_arr[j] == 1111) {
console.log("looks good");
}
}
loop(j+1); // Only now call the next "iteration"
})
})(0); // start the first iteration

或者,您可以promisify query 方法,然后使用 await 的强大功能:

// Create a promisified version of db.query
const queryPromise = (db, sql) =>
new Promise((resolve, reject) =>
db.query(sql, (err, result) => err ? reject(err) : resolve(result))
);

// Now you can use async/await and a for-loop
(async function () {
const pre_req_subjects_arr = [2310,2320,2410];

for (let j = 0; j < pre_req_subjects_arr.length; j++) {
console.log("j is : "+j);
try {
const preOfPreReq = await queryPromise(db, "SELECT `NUMBER` FROM `COURSE`");
console.log("j inside db query : "+j);
if (j==1) {
pre_req_subjects_arr.push(1111);
}
if (pre_req_subjects_arr[j] == 1111) {
console.log("looks good");
}
} catch(e) {
console.log("Error while creating array of pre_req subjects : " + e);
}
}
console.log("pre_req_subjects_arr is " + JSON.stringify(pre_req_subjects_arr));
})();

注意:顺便说一句:在循环中执行 SQL 查询通常是一个坏主意。通常您可以用单个更智能的查询来替换它。

关于javascript - 如何使 for 循环迭代从数据库结果添加到数组的附加元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54421707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com