Html을 읽어온 후 js 내의 함수가 실행되야 하는 코드를 짜야 하는데
비동기로 처리하지 않는다면 코드에 따라 html 불러오기를 완료하지 않은 후 함수를 먼저 실행되는 불상사가 일어날 수 있다.
이런 상황에선 비동기 처리를 해주어야 로드 후에 원하는 동작을 수행시킬 수 있다.
콜백 기반 비동기 처리
function loadScript(src, callback) {
let script = document.createElement('script');
script.src = src;
// 스크립트 로드 후 콜백 함수 실행
script.onload = () => callback(script);
document.head.append(script);
}
localScript("https://~",
script => {alert(`${script.src}가 로드되었습니다.`)})
콜백 속 콜백
function loadScript(src, callback) {
let script = document.createElement('script');
script.src = src;
// 스크립트 로드 후 콜백 함수 실행
script.onload = () => callback(script);
// 에러 처리 (로딩 실패할 경우)
script.onerror = () => callback(new Error("err"))
document.head.append(script);
}
loadScript('main.js', function(error, script){ // 오류 우선 콜백
if(error) {
// 에러 처리
} else {
// 성공적인 스크립트 로딩 후
}
})
Promise : 제작코드와 소비코드를 연결해주는 특별한 자바스크립트 '객체'
let promise = new Promise(function(resolve, reject) {
// executor(제작코드)
})
resolve(value)
— 일이 성공적으로 끝난 경우 그 결과를 나타내는 value
와 함께 호출reject(error)
— 에러 발생 시 에러 객체를 나타내는 error
와 함께 호출(1) resolve의 경우
let promise = new Promise(function(resolve, reject) {
// executor 자동 실행
// resolve 호출
setTimeout(() => resolve("완료"), 1000)
// promise 상태 변화 { state: "filtilled", result: "완료"}
})
(2) reject의 경우
let promise = new Promise(function(resolve, reject) {
// reject 호출
setTimeout(() => reject(new Error("에러 발생")), 1000)
// promise 상태 변화 { state: "rejected", result: Error 객체 }
})
let promise = new Promise(function(resolve, reject) {
resolve(123); // 즉시 호출
})
JS에서 코드에 따라 html 불러오기를 완료하지 않은 후 함수를 먼저 실행되는 불상사를 막기 위한 비동기 처리를 알아보았다.
비동기 처리를 하는 방법 중 Callback과 Promise를 사용하여 처리하는 방법을 배워보았는데 Callback을 사용하는 경우 일명 '콜백 지옥'을 경험할 수 있으니 비동기 처리를 해야할 땐 오늘 배운 Promise와 이후에 알아볼 async/await를 사용하는 것이 좋을 것 같다.