У меня возникают проблемы с попыткой передать некоторую информацию по URL-адресу в моем модуле запроса:
var request = require('request');
var fs = require('fs');
var url = 'https://parsons.nyc/aa/';
var zones = ['m01', 'm02', 'm03'];
for (var i = 0; i < zones.length; i++) {
// console.info(zones[i]);
request(url + zones[i] + '.html', function(error, response, body) {
// console.info(zones[i]);
if (!error && response.statusCode == 200) {
fs.writeFileSync('/home/ec2-user/environment/data/' + zones[i] + '.txt', body);
console.info(zones[i]);
} else {
console.info("Request failed!")
}
});
};
Когда я захожу внутрь запроса, zones[i] не определен, и я действительно не знаю почему.
Может кто-нибудь помочь мне с этим?
Цикл завершается до того, как запрос сможет выполнить ваш обратный вызов, и к тому времени i уже будет равен zones.length. Вместо этого подумайте об использовании zones.forEach, гораздо сложнее сделать эти ошибки с функциональным стилем.
Если я использую let, тогда это не сработает?
Это было бы так, потому что это делает i локальным в вашем цикле for. Это немного странно, потому что он захватывает этот конкретный экземпляр i, но все же позволяет вам впоследствии увеличивать его ... Я вообще-то не уверен, как это работает.
Хорошо, это в ES6 let заставляет i получать новую привязку с каждой итерацией цикла, согласно спецификация. Раньше это было не так, и некоторые старые браузеры (которые все еще поддерживают let) выдадут неверный результат.
Ой ! Большое спасибо !



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


попробуйте
let i = 0вместоvar i = 0