#node.js #request
Вопрос:
Я вызываю сетевые запросы в цикле forEach, каждый запрос возвращает новый объект, который я хотел бы переместить в массив, находящийся за пределами forEach. Когда он вызывается после ожидания завершения сетевых запросов, он возвращается как пустой «[]».
return this.get(urlOne, function (error, response) {
if (response.statusCode === 200) {
let array = [];
stores.forEach((store) => {
this.get(urlTwo, function (error, response) {
if (response.statusCode === 200) {
array.push(response.body);
}
});
});
console.log(array);
}
});
Ответ №1:
Это всего лишь предположение, но, stores.содержимое forEach асинхронно, поэтому console.log(массив) вызывается сразу после stores.forEach () — это d(не завершено), что означает, что массив пуст. console.log(массив); вероятно, необходимо вызывать, когда запросы фактически выполняются, а не сразу после их выполнения.
Самый простой способ проверить, верно ли это, — увидеть массив для каждого нажатия, если вы видите, что массив растет вместе с вашими данными, возникает проблема.
return this.get(urlOne, function (error, response) {
if (response.statusCode === 200) {
let array = [];
stores.forEach((store) => {
this.get(urlTwo, function (error, response) {
if (response.statusCode === 200) {
array.push(response.body);
console.log(array);
}
});
});
}
});
(ПРАВИТЬ)
if (response.statusCode === 200)
array.push(response.body);
else if(response.statusCode === 204)
console.log(array);
Код статуса 204 означает Отсутствие содержимого, если оно не отправляется автоматически или эквивалентно, вам может потребоваться отправить его вручную каким-либо способом.
Комментарии:
1. ДА. В этом есть смысл. Тогда вопрос в том, как бы я стал ждать завершения всех запросов и отправлять каждый ответ в массив?
2. Этот подход не сработал, массив никогда не печатается, так как я никогда не получаю ответ 204. Я не уверен, что вы понимаете, в чем проблема. Я вызываю несколько сетевых запросов, вложенных в один сетевой запрос. Каждый из этих сетевых запросов отвечает объектом JSON. Я хотел бы поместить каждый объект в массив вне цикла, в котором выполняются сетевые запросы, а затем распечатать окончательный массив, как только все запросы будут выполнены и массив будет заполнен.
3. Да, это будет зависеть от вашей реализации. Я сказал 204 или эквивалент, если они не отправляются, вам нужно будет отправить их. Вы можете установить код состояния в своем JSON, просто установите его на 204 или что-то другое, чем 200, чтобы вы могли определить разницу между ответом, содержащим данные массива, и ответом, который этого не делает, ответ, который не означает, что вы находитесь в конце массива, поэтому его безопасно отображать.