Async + Axios - 速率控制

Gar*_*ice 3 asynchronous node.js axios

我目前GET使用 Promise 向 API发送请求 200 次。毫不奇怪,在如此短的时间内允许最大连接数。

axios用来做这个:

const memberPromises = members.map(member => axios.get(`players/%23${member.tag}`))

axios.all().then().catch() // etc
Run Code Online (Sandbox Code Playgroud)

..其中成员最多可以包含 200 个元素。

似乎没有办法速率控制本机内的这些请求axios,但我会怎么用async的(或者如果有更好的另一个库)queue方法与concurrent参数限制并发请求数?

kkp*_*oon 5

这个怎么样?

将成员映射到承诺,在超时后解决承诺

let RATE_LIMIT_BASE = 100; //100ms separation

let promises = members.map((member, idx) => {
    return new Promise((resolve, reject) => {
        setTimeout(
            () =>
                axios
                    .get(`players/%23${member.tag}`)
                    .then(res => resolve(res))
                    .catch(err => reject(err)),
            RATE_LIMIT_BASE * idx
        );
    });
});

Promise.all(promises).then().catch(); // etc;
Run Code Online (Sandbox Code Playgroud)

在评论中,正如 marvel308 所说,

在某些情况下这可能会失败,因为 setTimeout 只是保证代码将在调用 setTimeout 后至少执行 100 毫秒,它们仍然可以在事件队列中排队,以防某些 CPU 密集型任务阻塞调用堆栈

感谢 marvel308 的建议

  • 在某些情况下这可能会失败,因为 setTimeout 只是保证代码将在调用 setTimeout 后至少执行 100 毫秒,它们仍然可以在事件队列中排队,以防某些 CPU 密集型任务阻塞调用堆栈 (2认同)