Promise.All()与Settimeout结合使用节流API调用



我有一组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);
}

谢谢!我对其进行了测试,并进行了splicemap以将其清洁一点,但是它确实可以按预期工作。

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);

最新更新