Как выполнить несколько GET-запросов последовательно?
В цикле делаю n-запросов к серверу. Каждый запрос выполняется больше 2-х минут. Все вроде бы хорошо, но ассинхронность jquery ставит мне палку в колёса. Данный код почему то выполняется ассинхронно, хотя я специально сделаю синхронные вызовы. Что я делаю не так?
for (let i = 0; i < counter; i++) {
(function(index) {
$.ajax({
url: "/suggestions",
type: "GET",
data: {pagetoken:pagetoken_, usertoken:usertoken_, adstoken:adstoken_,parentbm:parentbm_, proxy:proxy_},
success: function(data) {
//вывод данных
},
timeout: 300000
})
})(i);
Ответы (2 шт):
Автор решения: Vadim
→ Ссылка
Первый путь, можешь просто убрать у ажахса асинхронность, а т.е. просто добавь async: false
Вот твой код в синхроне:
for(let i = 0; i < counter; i++){
$.ajax({
url: '/suggestions',
type: 'GET',
timeout: 300000,
async: false,
data: {
pagetoken: pagetoken_,
usertoken: usertoken_,
adstoken: adstoken_,
parentbm: parentbm_,
proxy: proxy_
},
success: (r)=>{
console.log('end');
},
});
}
Второй путь - получше, делать его нужно так(да и я бы так сделал):
const getPage=(_url)=>{
return new Promise((resolve)=>{
$.ajax({
url: _url,
type: 'GET',
async: true,
}).done((r)=>{
if(!r)r = false;
// resolve(r);
resolve(true);
}).catch((e)=>{
console.log(e.status, e.responseText, e);
resolve(false);
});
});
};
(async()=>{
let r = await afetch('https://www.google.ru/');
console.log('response 1', r);
r = await afetch('https://www.google.com/');
console.log('response 2', r);
})();
Или вместо r=await... умножить на N, можно собрать массив и уже использовать ЭТО (promise all)
Автор решения: Давид Манжула
→ Ссылка
jQuery поддерживает async/await.
// Оборачиваем в async-замыкание, чтоб использовать await
(async () => {
for (let i = 0; i < counter; i++) {
const data = await $.ajax({
url: "/suggestions",
type: "GET",
data: {
pagetoken: pagetoken_,
usertoken: usertoken_,
adstoken: adstoken_,
parentbm: parentbm_,
proxy: proxy_,
},
timeout: 300000,
});
//вывод данных
console.log(data);
}
})();