Если вы используете версию Node, достаточно свежую для async/await
, это довольно безболезненно.Вы можете разбить свои запросы на группы, дождаться каждой группы, приостановить (ожидая тайм-аут) и продолжить.Например:
function getGroups(start, end, list) {
var promises = [];
end = end > list.length ? list.length : end
for (var i = start; i < end; i++) {
console.log("checking " + list[i]);
promises.push(doRequest(i));
}
return Promise.all(promises)
}
function doRequest(i) {
// fake request
return new Promise(resolve => setTimeout(() => resolve(i), 750))
}
async function get(list) {
const group_size = 5
const wait_time = 1500
for (var i = 0; i < list.length; i += group_size) {
console.log("getting group")
let group_result = await (getGroups(i, i + group_size, list))
console.log("results of group: ", group_result)
console.log("Waiting")
await new Promise(resolve => setTimeout(resolve, wait_time))
}
}
let urls = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
get(urls)
Если вы просто хотите поместить небольшую задержку между каждым запросом, вы можете использовать async/await
в цикле с чем-то вроде:
function doRequest(i) {
/* fake request */
console.log("requesting: ", i)
return new Promise(resolve => setTimeout(() => resolve(i), 250))
}
let urls = [0, 1, 2, 3, 4, 5]
async function get() {
let results = []
for (url of urls) {
results.push(await doRequest(url))
await new Promise(resolve => setTimeout(resolve, 200))
}
return results
}
get().then(r => console.log("results: ", r))
Конечно, вы захотите выполнить проверку ошибок и т. Д. ...