我创建了一个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头,它们在我的看来是相同的... - morphatic