我有一组n
用户,我需要点击一个API端点才能获取每个用户以获取更多信息,这对于Promise.all()
来说很容易,但是现在我的n
已经变得非常了更大,我现在需要将我的电话限制在每5秒钟约50。使用.reduce()
与setTimeout(() => {}, 5000)
合并到每5秒钟批次50个电话,但是仍然可以捕获Promise.all().then()
中的每个调用结果?
// Retrieve data from an API endpoint for n users [works]
const users = [...array of 50 ids];
Promise.all(users.map(user => axios.get(`api/users/${user.id})))
.then(results => resolve())
.catch(err => reject(err));
您可以做这样的事情,这有点伪,但我确定您要掌握了要素:(:(:
const batchSize = 50;
const promises = [];
const users = [...lots of users];
const userCount = users.length;
let userIdx=0;
function getUsers() {
for(let i=0;i<batchSize;i++) {
if(userCount < ++userIdx) {
Promise.all(promises).then(doYourStuff);
return;
}
promises.push(axios.get('api/users/' + users[userIdx]));
}
setTimeout(_ => getUsers(), 5000);
}
谢谢!我对其进行了测试,并进行了splice
和map
以将其清洁一点,但是它确实可以按预期工作。
const batchSize = 2;
const promises = [];
const users = ['a', 'b', 'c', 'd', 'e', 'f'];
function asyncTest(item) {
return new Promise((resolve, reject) => {
process.nextTick(() => {
console.log(item);
resolve(item);
})
})
}
function getUsers(xs) {
if (!xs.length) {
console.log("running 'em all");
Promise.all(promises);
return;
}
promises.push(xs.splice(0, batchSize).map(asyncTest));
setTimeout(_ => getUsers(xs), 500);
}
getUsers(users);