Передать параметр внешнего цикла в решение Promise - PullRequest
0 голосов
/ 24 октября 2019

У меня есть цикл 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 возвращает обещание). Но таким образом печатается неправильный idx, потому что значение idx увеличивается при разрешении обещания.

Как правильно передать переменную idx? Спасибо.

1 Ответ

1 голос
/ 24 октября 2019

Используйте let вместо var.

Измените это:

for(var idx=0; idx<arr.rows.length; idx++)

на это:

for(let idx=0; idx<arr.rows.length; idx++)

let является блок-ограничен блоком цикла for и будет поддерживать отдельную копию переменной для каждой итерации цикла, так что у каждого будет свой собственный и, следовательно, асинхронный обработчик .then(), который вызывается после цикла forполностью выполнено будет иметь соответствующее значение в своей собственной копии idx.

...