等待循环内的响应

时间:2018-11-16 18:19:29

标签: javascript asynchronous promise

我有以下代码,该代码使用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调用吗?

1 个答案:

答案 0 :(得分:0)

request()是非阻塞且异步的。因此,在您的任何for调用完成之前,您的request()循环运行到最后。有很多方法可以做到这一点,但据我所知,最好的方法是使用promise和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.all()告诉我们所有诺言何时得到解决(例如,所有请求都已完成)。然后将结果按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()或类似的东西。