비동기 JavaScript 코드를 작성하는 방법을 알아 내려고 온라인에서 많은 것을 읽었습니다. 내 연구에서 많이 등장한 기술 중 하나는 콜백을 사용하는 것입니다. 콜백 함수를 작성하고 실행하는 프로세스를 이해하지만 콜백이 자동으로 JavaScript 실행을 비동기 적으로 만드는 것처럼 보이는 이유가 혼란 스럽습니다. 그래서 내 질문은 : JavaScript 코드에 콜백 함수를 추가하면 어떻게 코드가 자동으로 비 동기화됩니까?
답변
그렇지 않습니다. 콜백을 받거나 콜백을 전달한다고해서 비동기적인 것은 아닙니다.
예를 들어, .forEach
함수는 콜백을 받지만 동기식입니다.
var available = false;
[1,2,3].forEach( function(){
available = true;
});
//code here runs after the whole .forEach has run,
//so available === true here
는 setTimeout
너무 콜백을 받아 비동기입니다.
function myFunction( fn ) {
setTimeout( function() {
fn(1,2,3);
}, 0 );
}
var available = false;
myFunction( function() {
available = true;
});
//available is never true here
Javascript에서 비동기 이벤트에 연결하려면 항상 콜백이 필요하지만 함수를 호출하거나 전달하는 것이 항상 비동기 적이라는 의미는 아닙니다.
답변
“마법”의 비밀은 콜백을 할당하는 이벤트 가 비동기 적이라는 것 입니다. JS 샌드 박스 외부의 백그라운드에서 수행중인 모든 작업 (예 : 원격 서버에서 무언가 검색)을 처리하기 위해 “후드”아래에서 구현됩니다. 그런 다음 작업을 마치면 JS 엔진에 이벤트를 호출하라는 메시지가 표시됩니다. JS 엔진이 현재 수행중인 작업으로 완료되면 대기중인 모든 이벤트를 호출하거나 새 메시지를 기다립니다. 그러면 콜백이 “마 법적으로”비동기 적으로 호출됩니다!
( 참고 : 이것은 JS 엔진이 다른 방식으로 구현할 것이기 때문에 세부 사항으로 다루지 않는 주제에 대한 매우 높은 수준의 개념적 개요입니다. 그러나 이것이 작동하는 일반적인 아이디어입니다.)