提问者:小点点

如何对forEach函数进行异步等待[重复]


我是异步等待和承诺的初学者。我读了很少的文章,看了很少的教程视频,但我仍然不能完全理解它。所以我现在正在研究一个代码

}).then(function() {
  var responseArray = []
  [url1,url2,url3,url4].forEach((url)=>{
      makeRequest(url)
  }).then((response)=>{
      responseArray.push(response)
  })
  return responseArray
})

因此,正如预期的那样,返回为空。我需要让它等待,直到来自每个makerequest(url)的所有响应都被推送到ResponseRay.br>这是我的尝试

}).then(function() {
      var responseArray = []
      [url1,url2,url3,url4].forEach((url)=>{
          async makeRequest(url)
      }).then((response)=>{
          await responseArray.push(response)
      })
      return responseArray
    })

谁能帮我修一下这个?


共2个答案

匿名用户

您需要将请求映射到承诺数组,然后使用:

.then(async () => {
  const responseArray = await Promise.all(
    [url1, url2, url3, url4].map(makeRequest)
  );
})

这将并行执行所有请求(这通常是您想要的,除非您想限制带宽等)。

如果您想要按顺序执行它们,就需要对最佳方法进行大量讨论。

匿名用户

如果使用,则不能等待解决所有承诺。使用改为:

}).then(async function() {
    var arr = ['url1', 'url2', 'url3', 'url4'];
    var responseArray = []; 
    for (url of arr) {
        cont response = await makeRequest(url);
        responseArray.push(response);
    }
    return responseArray;
});

或者,为了获得更好的性能,您可以使用Promise.all并行启动所有请求:

}).then(async function() {
    var arr = ['url1', 'url2', 'url3', 'url4'];
    var responseArray = await Promise.all(arr.map(function(url) {
        return makeRequest(url);
    }));
    return responseArray;
});

相关问题