Это учебное упражнение learnyounode 9 на node.js. У меня возникли проблемы с пониманием того, почему мой код не распечатывает данные по порядку.learnyounode - Juggling Async - разный порядок
let http = require('http'),
bl = require('bl'),
urlArray = [process.argv[2], process.argv[3], process.argv[4]]
results = []
//counter = 0;
function collectData(i) {
http.get(urlArray[i], (res) => {
res.pipe(bl((err, data) => {
if (err) {
return console.log(err);
}
data = data.toString();
results[i] = data;
//counter++;
//if (counter === 3) {
if (results.length === 3) {
results.forEach((result) => {
console.log(result);
})
}
}))
})
}
for (let i = 0; i < urlArray.length; i++) {
collectData(i);
}
Цикл for должен начинаться с первого URL-адреса и до конца доходить до конца. Из моего понимания, что бы ни происходило в текущей итерации цикла, необходимо решить, чтобы цикл переместился на следующую итерацию. Однако результаты кажутся случайными. Если я запустил свое решение в командной строке, иногда результаты в порядке, а иногда и нет.
Редактировать: Это мое текущее решение, которое работает. Я добавил переменную счетчика и поместил http-запрос в функцию.
* «все, что происходит в текущей итерации цикла должны решить для петли, чтобы перейти к следующей итерации» * - нет, это именно то, что асинхронный код. * нет * делаю. Это очень * определение * асинхронного. – JJJ
@JJJ Означает ли это, что все для циклов в node.js не обязательно запускаются по порядку? – James
Нет, это означает, что асинхронные методы не обязательно разрешаются по порядку. HTTP-запросы отправляются в порядке, вызываемые вызовы вызываются всякий раз, когда они получают ответ. – JJJ