@@ -96,6 +96,7 @@ Zone.__load_patch('XHR', (global: any, Zone: ZoneType) => {
96
96
const XHR_LISTENER = zoneSymbol ( 'xhrListener' ) ;
97
97
const XHR_SCHEDULED = zoneSymbol ( 'xhrScheduled' ) ;
98
98
const XHR_URL = zoneSymbol ( 'xhrURL' ) ;
99
+ const XHR_ERROR_BEFORE_SCHEDULED = zoneSymbol ( 'xhrErrorBeforeScheduled' ) ;
99
100
100
101
interface XHROptions extends TaskData {
101
102
target : any ;
@@ -126,9 +127,10 @@ Zone.__load_patch('XHR', (global: any, Zone: ZoneType) => {
126
127
const SCHEDULED = 'scheduled' ;
127
128
128
129
function scheduleTask ( task : Task ) {
129
- ( XMLHttpRequest as any ) [ XHR_SCHEDULED ] = false ;
130
130
const data = < XHROptions > task . data ;
131
131
const target = data . target ;
132
+ target [ XHR_SCHEDULED ] = false ;
133
+ target [ XHR_ERROR_BEFORE_SCHEDULED ] = false ;
132
134
// remove existing event listener
133
135
const listener = target [ XHR_LISTENER ] ;
134
136
if ( ! oriAddListener ) {
@@ -143,8 +145,11 @@ Zone.__load_patch('XHR', (global: any, Zone: ZoneType) => {
143
145
if ( target . readyState === target . DONE ) {
144
146
// sometimes on some browsers XMLHttpRequest will fire onreadystatechange with
145
147
// readyState=4 multiple times, so we need to check task state here
146
- if ( ! data . aborted && ( XMLHttpRequest as any ) [ XHR_SCHEDULED ] && task . state === SCHEDULED ) {
148
+ if ( ! data . aborted && target [ XHR_SCHEDULED ] && task . state === SCHEDULED ) {
147
149
task . invoke ( ) ;
150
+ } else if ( ! data . aborted && target [ XHR_SCHEDULED ] === false ) {
151
+ // error occurs when xhr.send()
152
+ target [ XHR_ERROR_BEFORE_SCHEDULED ] = true ;
148
153
}
149
154
}
150
155
} ;
@@ -155,7 +160,7 @@ Zone.__load_patch('XHR', (global: any, Zone: ZoneType) => {
155
160
target [ XHR_TASK ] = task ;
156
161
}
157
162
sendNative . apply ( target , data . args ) ;
158
- ( XMLHttpRequest as any ) [ XHR_SCHEDULED ] = true ;
163
+ target [ XHR_SCHEDULED ] = true ;
159
164
return task ;
160
165
}
161
166
@@ -191,8 +196,15 @@ Zone.__load_patch('XHR', (global: any, Zone: ZoneType) => {
191
196
args : args ,
192
197
aborted : false
193
198
} ;
194
- return scheduleMacroTaskWithCurrentZone (
199
+ const task = scheduleMacroTaskWithCurrentZone (
195
200
XMLHTTPREQUEST_SOURCE , placeholderCallback , options , scheduleTask , clearTask ) ;
201
+ if ( self && self [ XHR_ERROR_BEFORE_SCHEDULED ] === true && ! options . aborted &&
202
+ task . state === SCHEDULED ) {
203
+ // xhr request throw error when send
204
+ // we should invoke task instead of leaving a scheduled
205
+ // pending macroTask
206
+ task . invoke ( ) ;
207
+ }
196
208
}
197
209
} ) ;
198
210
0 commit comments