https://joseph0926.25
(Javascript) JavaScript async(Async)_01 (sync & async 코드, 이벤트 루프, 콜백 함수, async/await 키
이전 기사에서 JavaScript에서 개념적으로 가장 중요하다고 생각하는 두 부분이 있다고 언급했습니다. 두 번째 부분은 지금 살펴볼 부분으로 마지막으로 중요한 부분은 개인적으로 Java
joseph0926.tistory.com
위 링크에서 이 주제에 대해 자세히 읽었습니다.
다른 글을 쓰는 이유는
약속에 대한 설명 부족
위 기사의 설명 중 누락된 부분에 대한 추가 내용입니다.
이 기사에서 알아보십시오
- 콜백 지옥이란 무엇입니까?
- 약속이란 무엇입니까?
- async / await 키워드 추가
1. 콜백 지옥이란?
원래 기사에서 설명했듯이,
콜백 함수란? 이 코드는 비동기 코드를 작성할 때 필요하며 JavaScript와 브라우저 간의 통신 수단으로 사용되는 기능입니다.
우리는 또한 콜백 함수가 중첩될 수 있다고 말했습니다.
그러나 이 콜백 함수에는 치명적인 결함이 있습니다.
예를 들어보자
const dummyFn = () => {
console.log("add messi"); //1
console.log("messi start!"); //2
setTimeout(() => {
console.log("messi done..."); //4
console.log("pedri start!"); //5
setTimeout(() => {
console.log("pedri done.."); //7
console.log("dejong start!"); //8
setTimeout(() => {
console.log("dejong done..."); //9
}, 2000);
}, 5000);
console.log("add dejong"); //6
}, 10000);
};
dummyFn();
console.log("add pedri"); //3
- 각 플레이어가 추가 -> 시작 -> 완료 단계를 거쳐야 하고 반드시 setTimeout() 을 사용해야 한다고 가정해 보겠습니다.
- .그러면 위와 같이 코드를 작성할 수 있는데 코드만 봐도 뭐가 문제인지 알 수 있다.
- 콜백은 콜백을 둘러싸고 있고 그 콜백은 또 다른 콜백을 둘러싸고 있습니다. 이 콜백 지옥이 발생합니다.
- 이것은 코드 가독성이 심각하게 떨어지는 문제가 있다.
- 약속은 이 문제를 해결합니다.
2. 약속이란 무엇입니까?
- 이름에서 알 수 있듯이 무언가를 하겠다는 약속입니다.
- 약속이 보류 중이거나 완료되었거나 거부되었습니다.
- 약속 사용
- 약속을 만들다
- 상수 약속 = 새 약속();
- Promise() 생성자는 콜백 함수를 받아들입니다.
- 콜백 함수 전달
- 새로운 약속((해결, 거부) ⇒ {})
- 콜백 함수의 매개변수로 두 개의 함수를 지정할 수 있습니다.
- 해결된 경우 거부된 경우
- 약속을 만들다
const promise = new Promise((resolve, reject) => {
let isValid = true;
if (isValid) {
resolve("성공!");
} else {
reject("실패ㅠ");
}
});
3. 성공했을 때와 실패했을 때 대처해야 한다.
- 성공 → 해결 → 차단
- 약속하다. then((데이터) => {})
- 그런 다음 콜백 함수를 인수로 사용하고 약속 값은 콜백 함수에 대한 인수로 액세스할 수 있습니다(위 코드에서 “Success!”).
- 오류 → 거부 → 차단 차단
- 이전과 마찬가지로 catch 블록은 콜백 함수를 인수로 사용하고 약속의 값을 콜백 함수 인수로 액세스할 수 있습니다(위 코드에서 “실패”).
이렇게 사용할 수 있습니다.
그런 다음 Promise를 사용하는 샘플 코드를 살펴보고 위의 콜백 지옥보다 나은지 살펴보겠습니다.
btn.addEventListener("click", () => {
addColor(1000, messi, "red")
.then((data) => {
console.log(data);
addColor(2000, pedri, "green");
})
.then((data) => {
console.log(data);
addColor(5000, dejong, "blue");
})
.catch((err) => {
console.log(err);
});
});
const addColor = (time, element, color) => {
const promise = new Promise((resolve, reject) => {
if (element) {
setTimeout(() => {
element.style.color = color;
resolve();
}, time);
} else {
reject(new Error("Error!!!!!!"));
}
});
return promise;
};
코드가 기존 콜백 함수만 사용한다면,
addColor가 중첩되는 부분이 많이 복잡했을 것입니다.
반면에 Promise를 사용하면 Promise를 기반으로 분할되므로 가독성이 크게 향상됩니다.
- 그러나 위 코드의 두 번째 then이 실패하면 세 번째는 어떻게 됩니까?
- 약속은 기본적으로 비동기 코드이기 때문에 실행됩니다.
- 이것을 원할 수도 있지만 더 빨리 오류가 발생하면 중지하고 싶을 때가 있습니다.
- 여기에서 async/await를 사용합시다.
3. 비동기/대기 추가
async/await에 대한 설명은 이전 글에서 충분히 살펴봤고,
위의 Promise 샘플 코드를 async/await 코드로 대체하는 것으로 기사를 마무리하겠습니다.
btn.addEventListener("click", async () => {
displayColor().then((data) => {
console.log(data);
});
});
const displayColor = async () => {
try {
await addColor(1000, messi, "red");
await addColor(2000, pedri, "green");
await addColor(1000, dejong, "blue");
} catch (error) {
console.log(error);
}
};
const addColor = (time, element, color) => {
const promise = new Promise((resolve, reject) => {
if (element) {
setTimeout(() => {
element.style.color = color;
resolve("성공!");
}, time);
} else {
reject(new Error("Error!!!!!!"));
}
});
return promise;
};
여기서 두 번째 addColor에서 오류가 발생하면 세 번째 addColor는 무시되고 catch 블록으로 이동됩니다.

