我建立了一个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 ); });
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 documentation表示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 },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错误.在我的测试用例中,这个处理方式没有任何问题,但在第二个例子中,错误处理程序似乎没有被调用.
我不知道为什么测试用例按照我的预期工作,第二个没有.有任何想法吗?
应该是这样的格式:
$.ajax({ type: "POST",url: 'http://servername/WebService.svc/GetData?callback=?',success: function (data) { //do stuff },error: function (msg,b,c) { //alert error } });