我有一个用于查询数据库的for循环。我希望数据库调用是异步的。这是代码的结构:
for(var idx=0; idx<arr.rows.length; idx++)
{
db.query(`SELECT ...`)
.then((result) => {
console.log("Value is: " + result.rows[idx].val);
});
}
您可以看到,我希望在解析中打印参数idx
(db.query
返回一个Promise)。但是这种方式会打印错误的idx
,因为在解决承诺后idx
的值会增加。
传递变量idx
的正确方法是什么?谢谢。
使用let
代替var
。
更改此:
for(var idx=0; idx<arr.rows.length; idx++)
对此:
for(let idx=0; idx<arr.rows.length; idx++)
let
将为循环的每次迭代维护变量的单独副本,以便每个循环都有其自己的变量,因此在.then()
循环完成后调用的异步for
处理程序仍将具有idx
自己的副本中的适当值。