테스트 사이트 - 개발 중인 베타 버전입니다

send() 의 위치에 대해 채택완료

도레미 3년 전 조회 2,801

궁금한게 있습니다.

XMLHttpRequest 사용할 때 send() 메소드의 위치가 왜 onload = function() {  } 아래에 있는건지 궁금합니다.

상식적으로 open() 으로 열고 바로 send() 로 보낸 뒤에 결과가 오면 onload = function() {  } 로 처리해야 할것 같은데, 대부분의 교과서나 샘플코드를 보면 send() 메소드가 꼭 onload = function() {  } 아래에 있더라구요..

 

궁금해서 아래 코드의 ① 위치로 옮겨 보았는데, 역시 잘 실행됩니다.

그런데 보통 코드를 보면 다 ② 번 위치에 send()를 썻는데 이유가 뭐죠??

궁금한게 있습니다.

XMLHttpRequest 사용할 때 send() 메소드의 위치가 왜 onload = function() {  } 아래에 있는건지 궁금합니다.

상식적으로 open() 으로 열고 바로 send() 로 보낸 뒤에 결과가 오면 onload = function() {  } 로 처리해야 할것 같은데, 대부분의 교과서나 샘플코드를 보면 send() 메소드가 꼭 onload = function() {  } 아래에 있더라구요..

 

궁금해서 아래 코드의 ① 위치로 옮겨 보았는데, 역시 잘 실행됩니다.

그런데 보통 코드를 보면 다 ② 번 위치에 send()를 썻는데 이유가 뭐죠??

</p>

<p>function getSales() {</p>

<p>    var url = "<a href="http://localhost/sales.json";" target="_blank" rel="noopener noreferrer">http://localhost/sales.json";</a></p>

<p>    var request = new XMLHttpRequest();</p>

<p>    request.open("GET", url);</p>

<p>    // request.send(); //---> (1) 이자리에 와야 정상일것 같은데,</p>

<p> </p>

<p>    request.onload = function() {</p>

<p>       if (request.status == 200) {</p>

<p>               //-- 받은 내용 처리하는 코드</p>

<p>       }</p>

<p>    };</p>

<p>    request.send();  //--> (2) 여기에 두는 이유는???</p>

<p>}</p>

<p>

댓글을 작성하려면 로그인이 필요합니다.

답변 3개

채택된 답변
+20 포인트

똑같습니다.

이를테면 아래는 aaa 의 문자를 bbb 로 바꾸는 이벤트인데 원리적으로는 자바 스크립트가 아래에 있어야 맞는 것 같지만...

 

<div id=my>aaa</div>
<script>
document.addEventListener("DOMContentLoaded", function() { my.innerHTML = "bbb"; });
</script>

 

-----

 

아래코드처럼 위로 붙여도 상관없어요.

좀 이상한 것이 my가 정의되기 이전에 my를 부르는 함수를 쓰는데도 잘 돌아가는 것이 비상식적으로 느껴지기 쉽지만 페이지를 로드시킨 이후의 이벤트라는 것이 원래 그렇거든요.

이를테면 자식창이랄 수 있는 아이프레임을 온로드시켜 이벤트를 줄 때도 위치에 전혀 지장받지 않습니다.


<script>
document.addEventListener("DOMContentLoaded", function() { my.innerHTML = "bbb"; });
</script>

<div id=my>aaa</div>

 

예를들어

https://sir.kr/g5_skin/45028

성경톅스트 문서를 로드할때 저도 send() 를 위에 주었어요.

물론 이건 아작스 실시간이 아니라 문서를 100퍼센트 로딩시키고 성경문자열을 파싱했습니다만...

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

도레미
3년 전
아~ 감사합니다.
이제서야 추가 답변을 보았네요.

지금까지 절차식만 해와서 그런지 개념이 잘 이해 안되요...ㅠ
위치에 지장없으면 코드도 사람이 생각하는 순서대로 적어 주면 좋은데 대부분 (심지어 메뉴얼에서 조차) 그래서 무슨 이유가 있는 줄 알았습니다.

댓글을 작성하려면 로그인이 필요합니다.

말씀하신 바 지속적인 코딩을 하다 보면...

사람이 생각하는 순서대로 로직을 짜는 것이 아니라

"사람이라면 이리 안할 거야" 하면서

코드가 생각(?)하는 순서대로 로직을 짜고 있는 자신을 어느날 문득 발견하게 됩니다.

그 문지방을 넘어야 능숙한 개발자가 되는 것 같아요..

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

3년 전

보통 함수 앞에 on 이 있으면 ~~가 됬을때 실행한다는 이벤트의 의미입니다 

onClick -> 클릭했을때 

onChange -> 값이 바뀌었을때

 

onLoad 도 로드 됬을때 실행되는 함수겠죠, 

그럼 로드 됬을때 어떻게 할지 미리 정의해두고, 

그후에 send 로 호출 한다 이런개념인거 같네요 

 

아래 적어도 실행되는 이유는 원래 프로그램 한번 쭉 읽어서 함수 정의 먼저 읽고, 

그다음 소스코드 실행되는거때문에 되는거같네요 

 

확실하겐 모르겠고 암튼 그런느낌이에요 ㅎㅎ

 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 3개

도레미
3년 전
onLoad 는 서버에서 데이터를 가져왔을때 같은데요?
그런데 가져오려면 먼저 send() 로 요청을 해야 올텐데 왜 send()를 open() 바로 아래에 두지 않고 onLoad 아래에 두었는지 그게 궁금해서요..

물론 onLoad는 이벤트이니 send()를 보내고 응답이 와야지 반응하겠지만, 궁금한건 대부분의 코드에서 왜 send()를 아래에 썼는지... 그 이유가 궁금해서...
폭주죽
3년 전
개념 상으로도 그게 맞지않나요?
send() 자체가 response 를 리턴 한다면
var res = request.send() ;
이런식으로 그후에 작업을 절차지향 식으로 코딩하면 되는데,
그게 아니니까 일단
send() 가 실행되자마자 그 reponse 를 가지고 어떤작업을 해야하는지
미리 정해두고 그다음에 실행하는거죠 ㅎ
도레미
3년 전
그래도 무슨 말인지 이해가 안되요....ㅠ
조금 더 공부해 봐야 겠네요..

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인