XMLHttpRequest 의 결과가 다 반영 되었는지 체크하는 방법
본문
XMLHttpRequest 를 사용해서 가져온 다른 파일의 내용을 dom 에 삽입했습니다.
그리고 bbb()를 실행해야 하는데 바로 실행하면 에러가 발생합니다.
그래서 아래와 같이 setTimeout 으로 시간 간격을 주고 실행하면 잘 됩니다.
그런데 시간(500)을 너무 짧게해도 안되고, 컴퓨터에 따라 좀 다르기도 합니다.
아래 코드에서 id="main"의 내용이 확실하게 다 자리 잡은 다음에 bbb()가 실행되면 좋겠는데
다른 방법은 없을까요??
document.getElementById("main").onload = bbb();
처럼 해보니 아예 bbb()로 가지도 않는것 같고...ㅠ
aaa()
setTimeout(bbb, 500); //- 0.5초간 기다렸다 실행 (바로 하면 bbb 함수에서 에러발생)
function aaa() {
let req = new XMLHttpRequest();
req.open('GET', 'cc.php');
req.onload = function() {
if (req.status == 200) {
document.getElementById("main").innerHTML = this.responseText;
} else {
alert("Error: " + req.status);
}
}
req.send();
}
function bbb() {
// 이 안에 aaa() 에서 불러온 변수, id, class 를 사용하는 코드들이 있음
}
!-->
답변 3
동기식 샘플입니다. open() 마지막에 false 나 0을 주면 됩니다.
이리되면 로직이 입력된 순번대로 진행됩니다.
즉 문서 로딩이 끝난 후 밑줄의 로직이 실행됩니다.
function bbb() {
// 이 안에 aaa() 에서 불러온 변수, id, class 를 사용하는 코드들이 있음
}
let req = new XMLHttpRequest();
req.open('GET', 'cc.php', 0);
req.send();
document.getElementById("main").innerHTML = req.responseText;
bbb();
if (req.status == 200) {
document.getElementById("main").innerHTML = this.responseText;
이아래에서 바로 bbb() 실행하면 안되나요?
XMLHttpRequest
즉 바닐라 아작스의 이프문 안에 함수를 넣을 수 없는 상황이라면...
비동기식이 아니라 동기식으로 불러 사용하먼 어떤까요?
동기식으로 부르면 문서가 로딩된 후 다음 함수를 실행해도 순번적으로는 맞습니다.
꼭 실시간이 필요하지 않으면요.
답변을 작성하시기 전에 로그인 해주세요.