IT/잡다구리
[javascript] await 으로 element 가져오기, Promise.race
월공
2024. 10. 16. 15:16
728x90
300x250
element 가 로드 되지않았는데 가져오다보니 undefined 오류가 나서 await 을 추가해서 DOM 요소가 나올때까지 기다렸다 일정시간이 지나면 null 로 내뱉는 함수를 만들었다.
사실 내가 만든건 아님 채찍 형님이 만들었는데 유용하게 앞으로도 쓰일것 같아서 메모로 남긴다.
const element = await waitForElement("select_"+seq);
async function waitForElement(selector, timeout = 3000) {
const start = Date.now();
while (Date.now() - start < timeout) {
# querySelector 로 할지 getBy 로할지는 본인 선택
const element = document.getElementById(selector)
if (element) return element;
await new Promise(resolve => setTimeout(resolve, 300));
}
return null;
}
기본 timeout 3초로 잡고, 3초되기까지 0.3 초 동안 내내 while 문을 돌면서 element 가 로드 되었는지 안되었는지 체크 후 값이 있으면 뱉어주고 3초 지나면 null
이렇게 쓰다보니 while 문 보다 setInterval 로 처리하는게 낫다고해서 변경
그리고 Promise.race 사용
async function waitForElement(selector, timeout = 5000, interval = 300) {
const checkForElement = () => new Promise(resolve => {
const intervalId = setInterval(() => {
const element = document.getElementById(selector);
if (element) {
console.log(element)
clearInterval(intervalId);
resolve(element);
}
}, interval);
});
const timeoutPromise = new Promise(resolve => {
setTimeout(() => resolve(null), timeout);
});
return Promise.race([checkForElement(), timeoutPromise]);
}
그나저나 리액트 해야되는데 .. 요즘 자바 프로젝트 한다고 다 까먹겠네 ㅠ
728x90
300x250