Я работаю над проектом, в котором мне нужно пройти через несколько API и загрузить несколько страниц на каждом. У меня есть код, работающий с использованием обратных вызовов, но я не уверен, как запустить код после завершения последнего http-запроса.
const RateLimiter = require('limiter').RateLimiter;
const limiter = new RateLimiter(1, 'second');
request(url,{json:true}function(err,res,body){
let bunchOfURLs = body['bunchOfURLs'];
for(let i = 0; i < bunchOfURLs.length;i++){
limiter.removeTokens(1,function(){
request(bunchOfURLs[i],{json:true},function(err2,res2,body2){
let moreURLs = body2['moreURLs'];
for(let j = 0; j < moreURLs.length;j++){
request(moreURLs[j],function(err3,res3,body3){
// Once all downloads are done console.log('Done!')
});
}
});
}
}
});
Я думаю, что правильнее было бы вложить все функции в обещания и использовать Promise.all
для каждой из них. Проблема в ограничителе скорости, я думаю, что вложенные обещания не будут добавлены в массив promises
до вызова Promise.all
.
const RateLimiter = require('limiter').RateLimiter;
const limiter = new RateLimiter(1, 'second');
request(url,{json:true}function(err,res,body){
let bunchOfURLs = body['bunchOfURLs'];
let promises = [];
for(let i = 0; i < bunchOfURLs.length;i++){
promises.push(new Promise((resolve,reject)=>{
limiter.removeTokens(1,function(){
request(bunchOfURLs[i],{json:true},function(err2,res2,body2){
let moreURLs = body2['moreURLs'];
for(let j = 0; j < moreURLs.length;j++){
// I dont' think these will be added
promises.push(new Promise((resolve,reject)=>{
request(moreURLs[j],function(err3,res3,body3){
resolve();
});
}))
}
});
}
}))
}
Promise.all(promises).then(()=>{console.log('Done!')});
});