Не удалось сохранить результат асинхронной операции в массиве

#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, чтобы вы могли определить разницу между ответом, содержащим данные массива, и ответом, который этого не делает, ответ, который не означает, что вы находитесь в конце массива, поэтому его безопасно отображать.