사실은 retry되는게 아니라 onreadystatechange의 특징 때문입니다
onreadystatechange는 말 그대로 readyState가 바뀔 때마다 실행될 핸들러를 지정하는 프로퍼티인데
하나의 리퀘스트가 진행되는 동안 readyState는 다음과 같은 state들로 변경됩니다 (5개니 4번 변경이 있겠죠)
그러니 죽이되든 밥이되든 4번 실행되겠죠
| Value | State | Description |
| 0 | UNSENT | Client has been created. open() not called yet. |
| 1 | OPENED | open() has been called. |
| 2 | HEADERS_RECEIVED | send() has been called, and headers and status are available. |
| 3 | LOADING | Downloading; responseText holds partial data. |
| 4 | DONE | The operation is complete. |
onreadystatechage를 open 실행 이후에 지정했다면 횟수는 줄겠네요
여러번 메세지가 출려된 다음에 프리징된다는 걸 보면 send()가 실행된 시점에서는 의도대로 비동기적로 넘어갔고 마지막에 operation이 done됐을 때의 핸들러에서의 처리에서 뭔가 문제가 생긴게 아닌가 조심스레 추측해봅니다
비동기더래도 현재 실행되고 있는 작업에서 멈춰버리면 다같이 멈추니까요