@@ -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,7 +145,7 @@ 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
// check whether the xhr has registered onload listener
148
150
// if that is the case, the task should invoke after all
149
151
// onload listeners finish.
@@ -167,6 +169,9 @@ Zone.__load_patch('XHR', (global: any, Zone: ZoneType) => {
167
169
} else {
168
170
task . invoke ( ) ;
169
171
}
172
+ } else if ( ! data . aborted && target [ XHR_SCHEDULED ] === false ) {
173
+ // error occurs when xhr.send()
174
+ target [ XHR_ERROR_BEFORE_SCHEDULED ] = true ;
170
175
}
171
176
}
172
177
} ;
@@ -177,7 +182,7 @@ Zone.__load_patch('XHR', (global: any, Zone: ZoneType) => {
177
182
target [ XHR_TASK ] = task ;
178
183
}
179
184
sendNative ! . apply ( target , data . args ) ;
180
- ( XMLHttpRequest as any ) [ XHR_SCHEDULED ] = true ;
185
+ target [ XHR_SCHEDULED ] = true ;
181
186
return task ;
182
187
}
183
188
@@ -207,8 +212,15 @@ Zone.__load_patch('XHR', (global: any, Zone: ZoneType) => {
207
212
} else {
208
213
const options : XHROptions =
209
214
{ target : self , url : self [ XHR_URL ] , isPeriodic : false , args : args , aborted : false } ;
210
- return scheduleMacroTaskWithCurrentZone (
215
+ const task = scheduleMacroTaskWithCurrentZone (
211
216
XMLHTTPREQUEST_SOURCE , placeholderCallback , options , scheduleTask , clearTask ) ;
217
+ if ( self && self [ XHR_ERROR_BEFORE_SCHEDULED ] === true && ! options . aborted &&
218
+ task . state === SCHEDULED ) {
219
+ // xhr request throw error when send
220
+ // we should invoke task instead of leaving a scheduled
221
+ // pending macroTask
222
+ task . invoke ( ) ;
223
+ }
212
224
}
213
225
} ) ;
214
226
0 commit comments