【问题标题】:Replacing a looped http call with Promise.all用 Promise.all 替换循环的 http 调用
【发布时间】:2020-07-10 08:06:31
【问题描述】:

我正在尝试替换使用 Axios 发送 http 请求的循环。 http 是一个 Axios 对象并返回一个承诺。我想更改代码以便使用 Promises.all() 而不是循环。我正在尝试创建一个 Promise,推入一个数组,然后传递给 Promises.all。我的 promises 数组中只有空数组。

如果我做错了什么,我将不胜感激。

// Converting this 
responseData = [];
for (const record of response.records) {
    let response = await http.get('/records/' + record.id);
    responseData.push(response.data.data);
}




    // I am trying to convert to this ..
      let promises = [];
      for (const record of response.data.data) {
          let promise = new Promise((resolve, reject) => {
             let response = http.get('/records/' + record.id)
                     .then(response => {
                       return response.json();
                     })
                     .then(resp => {
                       // console.log(resp.data.data);
                         //return resp.data.data
                         resolve(resp.data.data);
                     });
    
             return response;
    
          });
          promises.push(promise);
      }
    
      Promise.all(promises).then(records);

【问题讨论】:

    标签: javascript axios es6-promise


    【解决方案1】:

    不完全确定是否需要 response.json(),以及 .records 和 .data.data 应该放在哪里......但这可能有效:

      const promises = [];
      for (const record of response.records) {
          promises.push(
              http.get('/records/' + record.id)
                  .then(response => response.json())    //maybe?
                  .then(response => response.data.data)
          )
      }
      Promise.all(promises).then(records => { /* do something */ } );
    

    或使用地图:

    const promises = response.records.map(record => 
         http.get('/records/' + record.id)
             .then(response => response.json())    //maybe?
             .then(response => response.data.data)
    )
    Promise.all(promises).then(responseData => {/* do something */} );
    

    【讨论】:

    • 谢谢伙计。第二个对我有用。那么,实际的 http.get() 何时发生在第一张地图或 Promise.all() 中?
    • 它发生在两者之间。 Promise.all 是所有 http.gets 完成的点,您希望得到答案,而这主要是您关心的。每一个都在调用 http.get 时开始,或者严格来说,它在调用 http.get 时被卡在事件循环中,在事件循环到达它时执行(以及随后的 .thens 在此之后执行)。这样做的好处是它们可以并行执行(“非阻塞 IO”等等),并且您可以要求一个在另一个返回之前启动,我们在这里使用 map。
    猜你喜欢
    • 1970-01-01
    • 2021-03-19
    • 2020-02-07
    • 2019-04-04
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多