Я построил тестовый пример вызова ajax (jQuery 1.6.2), который выглядит так:
jQuery( document ).ready( function( $ ) {
var test = function( x ) {
$.ajax({
url: 'http://www.someotherdomain.com/test.php',
data: { x: x },
dataType: 'jsonp',
crossDomain: true,
success: function( data ) {
console.log( data.name );
},
error: function() {
x++;
test( x );
}
});
};
test( 1 );
});
И соответствующий файл test.php выглядит так:
if ( 5 > $_GET[ 'x' ] ) {
header('HTTP/1.1 503 Service Temporarily Unavailable'); die();
} else {
header( 'content-type: application/x-javascript' );
echo $_GET[ 'callback' ] . '({"name":"Morgan"})';
}
Хотя в документации jQuery указано, что обработчик ошибок для вызовов jsonp никогда не запускается, этот сценарий работает. как я и предполагал. Он делает четыре «неудачных» вызова test.php, которые возвращают 503 ошибки, а затем test()
рекурсивно вызывает себя, увеличивая x до тех пор, пока вызов ajax не станет «успешным» и данные не будут выведены на консоль.
Итак, мой тестовый пример выше работает, но мой реальный код не работает, что больше похоже на следующее:
jQuery( document ).ready( function( $ ) {
var completed = 0;
var fiftystates; // assume an array of state objects
var updateState = function( index, state ) {
var d = index % 5; // for subdomains sub0, sub1, sub2, sub3, sub4
$.ajax({
url: 'http://sub' + d + '.mydomain.com/update_state.php',
data: { state: state.id },
dataType: 'jsonp',
crossDomain: true,
success: function() {
completed++;
var complete_percent = completed / fiftystates.length * 100;
$( '#progressbar' ).progressbar( 'value', completed_percent );
},
error: function() {
updateState( index, state );
}
}); // end ajax
}; // end updateState
$( fiftystates ).each( updateState );
};
Как вы можете видеть, это циклически проходит через 5 различных поддоменов, которые на самом деле являются просто зеркалами одного и того же домена, но, поскольку выполнение update_state.php может занять до 30 секунд, процесс занимает от 25 минут до менее трех минут. Проблема в том, что из-за перегрузки сервера некоторые запросы ajax завершаются с ошибкой 503. В моем тестовом случае это было обработано без проблем, но во втором примере обработчик ошибок никогда не вызывается.
Я не могу понять, почему тестовый пример работает так, как я ожидаю, а второй - нет. Любые идеи?
header()
для возврата 503 ведет себя иначе, чем фактическое 503? Я изучил заголовки HTTP в обоих случаях, и они выглядят одинаково для меня... - person morphatic   schedule 07.10.2011