Я бег функции под названием checker
каждых 60 секунд, как так:Multiple AJAX вызовов без блокировки
setInterval(checker, 60 * 1000);
checker
имеет множество URL-адреса, которые утилита проверяет с помощью AJAX, текущий код выглядит так:
$.ajax({
url: sites[i].url,
type: "GET",
dataType: "json",
async: false,
success: function(data){
//blah blah blah
}else{
//something else
},
error: function(){
//blah blah blah
}
});
Код работает, изменяет некоторые элементы на основе пользовательского интерфейса в зависимости от результатов JSON. Моя проблема в том, что время выполнения этой проверки нескольких сайтов составляет ~ 4 секунды, после чего страница перестает отвечать на запросы. Если я удалю async: false
, код больше не работает должным образом.
Кто-то упоминает использование обратных вызовов для решения проблемы, но не понимает, как их использовать в этом контексте.
EDIT
Обновленный код, основанный на предложении от adosan:
function promtest(){
var sites = [
{ name: "WorkingSite", url: "http://sitename.com/testing.php" },
//a bunch more sites, 1 returns a 404 to test for failure
{ name: "404Site", url: "http://404url.com/testing.php" }
];
var promiseList = [];
for(var i in sites){
var promise = $.ajax({
url: sites[i].url,
type: "GET",
dataType: "json",
async: true,
success: function(data){
if(data.Response != 'OK'){
console.log('Site ' + sites[i].name + ' Not OK');
}else{
console.log('Site ' + sites[i].name + ' OK ');
}
},
failure: function(data){
console.log('Failure for site: ' + sites[i].name);
},
error: function(){
console.log('Site ' + sites[i].name + ' Not OK');
}
});
promiseList.push(promise);
}
$.when.apply($, promiseList).then(function(){console.log('success')}, function(){console.log('fail')});
}
В консоли я вижу:
Site 404Site Not OK
Site 404Site Not OK
Site 404Site Not OK
Site 404Site Not OK
Site 404Site Not OK
Site 404Site Not OK
Site 404Site Not OK
fail
Site 404Site Not OK
Site 404Site Not OK
Site 404Site Not OK
Site 404Site Not OK
Обратите внимание, что название сайта всегда показывает, как последний один в списке.
Просьба уточнить, что не работает, когда вы удалите асинхр: ложное значение. –
Рассматривали ли вы его асинхронно ('async: true'')? – Crowes
Я не думаю, что код выше действительно работает ... * else * находится вне функции. – Robert