사용은 하고 있었지만 정식적으로 다뤄보지 않은 개념인데 이제서야 다뤄본다.
function taskA() {console.log("TASK A")}
function taskB() {console.log("TASK B")}
function taskC() {console.log("TASK C")}
이때 순서는 실행되는 순서는 상관 없다.
< 자바스크립트의 싱글 스레드 작업 수행 방식>
-> 이는 동기 방식의 처리// 블로킹 방식
<단점>
그렇다면 쓰레드를 확장 시키면 되지 않을까???
<MultiThread>
하지만! JS는 싱글 쓰레드로 동작한다.
그렇다면 어떻게 해야할까?
그냥 작업을 여러개 동시에 실행시켜보자.
즉, 먼저 작성된 코드의 결과를 기다리지 않고 다음 코드를 바로 실행하도록 하는 것이다.
-> 이게 비동기 작업 // 논 블로킹 방식
그럼 이 비동기로 실행된 작업들이 어떻게 끝났고 완료 되었는지 확인은 어떻게 할까?? 상단에 써놓은 코드를 예시로 들었을 때
function taskA(resultA) {
console.log(`TASK A작업이 끝났습니다 결과 :${resultA}`)
}
function taskB(resultB) {
console.log(`TASK B작업이 끝났습니다 결과 :${resultB}`)
}
function taskC(resultC) {
console.log(`TASK C작업이 끝났습니다 결과 :${resultC}`)
}
작업이 끝나면 실행하도록 콜백 함수를 붙여서 전달해주면 된다.
연습해보기
function taskA() {
console.log("A작업 끝")
}
taskA();
console.log("코드 끝");
// A작업 끝
// 코드 끝
taskA
의 함수가 끝난 뒤 코드 끝이라는 코드가 동작함으로 비동기 방식이라고 생각하면 된다
function taskA() {
setTimeout(()=>{
console.log("A작업 끝")
},2000)
}
taskA();
console.log("코드 끝");
// 코드 끝
// A작업 끝
이번엔 코드 끝이 먼저 나왔다. taskA
가 끝나기 전에 코드 끝이라는 코드가 실행 됐는데 비 동기 방식이라 생각하자
function taskA(a, b, cb) {
setTimeout(()=>{
const res = a + b;
cb(res)
},2000);
}
taskA(3, 4, (res)=>{console.log("A TESK RESULT : ", res)});
console.log("코드 끝");
// 코드 끝
// A TESK RESULT : 7
왜 이렇게 진행 될까?
JS 엔진은 Heap과 Call Stack 이라는 메모리 할당과 코드 실행으로 구성되어 있다.
JS가 처음 시작되면