多个 Http 请求调用并存储在一个数组中,但如何在使用数组之前等待所有请求完成

use*_*127 1 javascript asynchronous node.js

我有一个要循环的值数组。这些值中的每一个都将用于向服务器发出 http 请求。我将从服务器收到每个请求的响应。我想将所有这些响应存储在一个数组中,然后在所有请求完成后对数组进行处理。由于我的代码的异步性质,我不确定如何让应用程序等待所有请求都完成。正在发生的事情是我正在发出请求,但由于异步性质,我想要对数组进行的工作在所有请求完成之前就已经开始。我怎样才能使这段代码“同步”,因为它会等待所有请求完成,然后才开始使用 listOfResponses 数组

//import the require library to make http requests to a server
const request = require('request');

//values to be sent via a restful GET request 
const list = [
  'value_one',
  'value_two'
];

//store resoonses from GET request
var listOfResponses = [];

//loop through the list
list.forEach(function(word) {

  //Make a rest GET call to a server
  var url = 'http://notsurehowtomakethisworksoiamaskingstackoverflow.com/api/words/' + word;
  request(url, {
    json: true
  }, (err, res, body) => {
    if (err) {
      return console.log(err);
    }

    //store the response from the server into out array
    listOfResponses.push(body.response);
  });
});


/* ******************************* 
HERE I WANT TO DO STUFF WITH listOfResponses ONCE ALL THE REQUESTS FINISH
********************************** */
Run Code Online (Sandbox Code Playgroud)

Jon*_*lms 6

只需将其映射到一系列承诺:

  const promises = list.map(word => new Promise(resolve => {
   var url = 'http://notsurehowtomakethisworksoiamaskingstackoverflow.com/api/words/' + word;
   request(url, {
     json: true
   }, (err, res) => {
     if (err) {
       return reject(err);
     }   
     resolve(res.body);
   });
 }));
Run Code Online (Sandbox Code Playgroud)

然后您可以使用Promise.all以下方法获得所有结果:

 Promise.all(promises).then(results => {
  //...
 });
Run Code Online (Sandbox Code Playgroud)