【问题标题】:Wait for response inside for loop在 for 循环中等待响应
【发布时间】:2018-11-17 02:33:52
【问题描述】:

我有以下代码,它使用request npm 进行第三方 api 调用

const array = []
for (var i = 0; i < 10; i++) {
  request('api_call', function(err, res) {
    array.push(res)
  })
}
console.log(array)

但是在数组中没有得到任何东西。

谁能帮助我如何等待所有 10 个 api 调用?

【问题讨论】:

标签: javascript asynchronous promise


【解决方案1】:

request() 是非阻塞和异步的。因此,在您的任何 request() 调用完成之前,您的 for 循环将运行到最后。有很多方法可以做到这一点,但我所知道的最好的方法是使用 promises 和Promise.all()

const rp = require('request-promise');
const promises = [];

for (var i = 0; i < 10; i++) {
  promises.push(rp('api_call'));
}
Promise.all(promises).then(results => {
   console.log(results);
}).catch(err => {
   console.log(err);
});

request-promise 是请求库的承诺版本(返回承诺而不是使用普通回调)。这段代码将 Promise 累积到一个数组中,然后使用Promise.all() 告诉我们所有 Promise 何时已解决(例如,所有请求都已完成)。然后将结果在results 数组中按顺序呈现给我们。

此方法并行运行您的所有请求。


如果您想按顺序而不是并行运行它们,您可以使用async/await 让每个结果的for 循环暂停,然后再继续。

const rp = require('request-promise');

async function myFunc() {
    const results = [];
    for (let i = 0; i < 10; i++) {
        let r = await rp('api_call');
        results.push(r);
    }
    return results;
}


myFunc().then(results => {
   console.log(results);
}).catch(err => {
   console.log(err);
});

如果您实际上不只是发送 10 次相同的请求,而是实际上迭代一个数组以进行 10 次 api 调用,那么您可能会使用 .map() 或类似的东西。

【讨论】:

  • 一个伟人的好答案。非常感谢您如此冗长的解释。
  • 能否告诉我什么是普通回调
  • @DarkKnight - 原始代码中的 function(err, res) {} 是一个简单的回调。
猜你喜欢
  • 2019-07-18
  • 1970-01-01
  • 2017-07-21
  • 2023-01-20
  • 1970-01-01
  • 2018-06-09
  • 2018-01-06
相关资源
最近更新 更多