节点 js 与循环顺序的问题



您好,我真的需要解决此问题的帮助,我的最后一个控制台.log是在 for 循环之前执行的,我不知道如何解决它。我真的需要在 for 循环之后访问我的阵列 nbfilm

有人可以帮助我吗?

控制台打印的内容:留置权

client.db.query("SELECT name,id FROM film", function (err, result) {
if (err) throw err;
const catalog = new MessageEmbed()
.setTitle("Catalogue")
.setColor("#fcfe80")
.setFooter({text:"   ・ PopFlix"})
let testresult =[]
let nbfilm =[]
for (let compteur of result){
testresult.push(compteur.id)
testresult.push(compteur.name)
}
console.log(testresult)
for (let compteur2 = 0; compteur2 < testresult.length; compteur2+=2){
client.db.query(`SELECT link FROM lien WHERE fid=${testresult[compteur2]}`, function (err,result) {

nbfilm.push(testresult[compteur2+1])
nbfilm.push(result.length)
console.log("nbfilm in for loop",nbfilm)
});

}
console.log("nbfilmAFTER",nbfilm)
});

循环的主体延迟执行。由于 javascript 是一种异步 I/O 类型操作语言,因此返回 promise 是很常见的。换句话说,代码按预期执行,但只有在完成所有挂起任务后,操作的结果才可见。在您的情况下,在代码中添加 async/await 可能会有所帮助。使用它节点文档

看起来client.db.query是异步的。这里的 JS 按预期工作,因为它不会等待查询完成,然后再移动到下一行。

现在更好的做法是使用 async/await 而不是回调。如果您提供正在使用的包,我们可以提供一个代码示例。

client.db.query()

是一个异步函数,无论查询实际运行的速度如何,在执行console.log(nbfilm)之前都不会执行。

我建议使用Promise.all().您还必须"承诺"query()功能。传递要resolve()的所有内容,然后在最后一行中将它们连接起来,如下所示。

let promises = [];
for(....) {
promises.push(new Promise((resolve, reject) => {
client.db.query("select ... ", () => {
// all the same stuffs
resolve([testresult[compteru2+1], result.length]);
});
}))
}
Promise.all(promises)
.then((results) => results.reduce((p, c) => p.concat(c), []))
.then(data => console.log(data));  // do whatever you want with "data"

下面是一个简化的演示: https://codesandbox.io/s/promise-all-example-78r347

最新更新