我有下面的代码,它使用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 调用?
request()
是非阻塞和异步的。所以你的for
循环运行到最后,在你的任何request()
调用完成之前。有很多方法可以做到这一点,但我所知道的最好的方法是使用 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()
或类似的东西。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句