@@ -406,6 +406,9 @@ jQuery.extend( {
406406 // Url cleanup var
407407 urlAnchor ,
408408
409+ // Request state (becomes false upon send and true upon completion)
410+ completed ,
411+
409412 // To know if global events are to be dispatched
410413 fireGlobals ,
411414
@@ -435,9 +438,6 @@ jQuery.extend( {
435438 requestHeaders = { } ,
436439 requestHeadersNames = { } ,
437440
438- // The jqXHR state
439- state = 0 ,
440-
441441 // Default abort message
442442 strAbort = "canceled" ,
443443
@@ -448,7 +448,7 @@ jQuery.extend( {
448448 // Builds headers hashtable if needed
449449 getResponseHeader : function ( key ) {
450450 var match ;
451- if ( state === 2 ) {
451+ if ( completed ) {
452452 if ( ! responseHeaders ) {
453453 responseHeaders = { } ;
454454 while ( ( match = rheaders . exec ( responseHeadersString ) ) ) {
@@ -462,22 +462,22 @@ jQuery.extend( {
462462
463463 // Raw string
464464 getAllResponseHeaders : function ( ) {
465- return state === 2 ? responseHeadersString : null ;
465+ return completed ? responseHeadersString : null ;
466466 } ,
467467
468468 // Caches the header
469469 setRequestHeader : function ( name , value ) {
470- var lname = name . toLowerCase ( ) ;
471- if ( ! state ) {
472- name = requestHeadersNames [ lname ] = requestHeadersNames [ lname ] || name ;
470+ if ( completed == null ) {
471+ name = requestHeadersNames [ name . toLowerCase ( ) ] =
472+ requestHeadersNames [ name . toLowerCase ( ) ] || name ;
473473 requestHeaders [ name ] = value ;
474474 }
475475 return this ;
476476 } ,
477477
478478 // Overrides response content-type header
479479 overrideMimeType : function ( type ) {
480- if ( ! state ) {
480+ if ( completed == null ) {
481481 s . mimeType = type ;
482482 }
483483 return this ;
@@ -487,16 +487,16 @@ jQuery.extend( {
487487 statusCode : function ( map ) {
488488 var code ;
489489 if ( map ) {
490- if ( state < 2 ) {
491- for ( code in map ) {
492-
493- // Lazy-add the new callback in a way that preserves old ones
494- statusCode [ code ] = [ statusCode [ code ] , map [ code ] ] ;
495- }
496- } else {
490+ if ( completed ) {
497491
498492 // Execute the appropriate callbacks
499493 jqXHR . always ( map [ jqXHR . status ] ) ;
494+ } else {
495+
496+ // Lazy-add the new callbacks in a way that preserves old ones
497+ for ( code in map ) {
498+ statusCode [ code ] = [ statusCode [ code ] , map [ code ] ] ;
499+ }
500500 }
501501 }
502502 return this ;
@@ -560,7 +560,7 @@ jQuery.extend( {
560560 inspectPrefiltersOrTransports ( prefilters , s , options , jqXHR ) ;
561561
562562 // If request was aborted inside a prefilter, stop there
563- if ( state === 2 ) {
563+ if ( completed ) {
564564 return jqXHR ;
565565 }
566566
@@ -642,7 +642,7 @@ jQuery.extend( {
642642
643643 // Allow custom headers/mimetypes and early abort
644644 if ( s . beforeSend &&
645- ( s . beforeSend . call ( callbackContext , jqXHR , s ) === false || state === 2 ) ) {
645+ ( s . beforeSend . call ( callbackContext , jqXHR , s ) === false || completed ) ) {
646646
647647 // Abort if not done already and return
648648 return jqXHR . abort ( ) ;
@@ -671,7 +671,7 @@ jQuery.extend( {
671671 }
672672
673673 // If request was aborted inside ajaxSend, stop there
674- if ( state === 2 ) {
674+ if ( completed ) {
675675 return jqXHR ;
676676 }
677677
@@ -683,18 +683,17 @@ jQuery.extend( {
683683 }
684684
685685 try {
686- state = 1 ;
686+ completed = false ;
687687 transport . send ( requestHeaders , done ) ;
688688 } catch ( e ) {
689689
690- // Propagate exception as error if not done
691- if ( state < 2 ) {
692- done ( - 1 , e ) ;
693-
694- // Simply rethrow otherwise
695- } else {
690+ // Rethrow post-completion exceptions
691+ if ( completed ) {
696692 throw e ;
697693 }
694+
695+ // Propagate others as results
696+ done ( - 1 , e ) ;
698697 }
699698 }
700699
@@ -703,13 +702,12 @@ jQuery.extend( {
703702 var isSuccess , success , error , response , modified ,
704703 statusText = nativeStatusText ;
705704
706- // Called once
707- if ( state === 2 ) {
705+ // Ignore repeat invocations
706+ if ( completed ) {
708707 return ;
709708 }
710709
711- // State is "done" now
712- state = 2 ;
710+ completed = true ;
713711
714712 // Clear timeout if it exists
715713 if ( timeoutTimer ) {
0 commit comments