Skip to content

Commit 27d24ff

Browse files
committed
fix bug add event listener to xhrhttprequest multiple times angular#527
1 parent c36c0bc commit 27d24ff

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

lib/browser/browser.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ patchXHR(_global);
4848

4949
const XHR_TASK = zoneSymbol('xhrTask');
5050
const XHR_SYNC = zoneSymbol('xhrSync');
51+
const XHR_LISTENER = zoneSymbol('xhrListener');
5152

5253
interface XHROptions extends TaskData {
5354
target: any;
@@ -63,13 +64,20 @@ function patchXHR(window: any) {
6364

6465
function scheduleTask(task: Task) {
6566
var data = <XHROptions>task.data;
66-
data.target.addEventListener('readystatechange', () => {
67+
// remove existing event listener
68+
var listener = data.target[XHR_LISTENER];
69+
if (listener) {
70+
data.target.removeEventListener('readystatechange', listener);
71+
}
72+
var newListener = data.target[XHR_LISTENER] = () => {
6773
if (data.target.readyState === data.target.DONE) {
6874
if (!data.aborted) {
6975
task.invoke();
7076
}
7177
}
72-
});
78+
};
79+
data.target.addEventListener('readystatechange', newListener);
80+
7381
var storedTask: Task = data.target[XHR_TASK];
7482
if (!storedTask) {
7583
data.target[XHR_TASK] = task;

test/browser/XMLHttpRequest.spec.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,4 +182,16 @@ describe('XMLHttpRequest', function() {
182182
expect(XMLHttpRequest.LOADING).toEqual(3);
183183
expect(XMLHttpRequest.DONE).toEqual(4);
184184
});
185+
186+
it('should work properly when send request multiple times on single xmlRequest instance', function() {
187+
testZone.run(function() {
188+
var req = new XMLHttpRequest();
189+
req.open('get', '/', true);
190+
req.send();
191+
req.onloadend = function() {
192+
req.open('get', '/', true);
193+
req.send();
194+
}
195+
});
196+
})
185197
});

0 commit comments

Comments
 (0)