function B(){
console.log('called at the back!');
}
function A(callback){
callback(); // callback === B
}
A(B);
전화 | 문자 |
---|---|
하던 일을 멈추고 받아야 함(blocking) | 확인 후, 나중에 답장 가능(non-blocking) |
요청에 대한 결과가 동시에 일어남(synchronous) | 요청에 대한 결과가 동시에 일어나지 않음(asynchronous) |
커피 주문이 동기적이라면?
손님 2는 손님1이 커피를 받을 때까지 주문도 하지 못하고 대기열에 머물러 있어야한다.
but 비동기적?
주문: call
완성: event
손님을 부름: callback(eventhandler)
아래의 두 코드를 비교해보면서 차이점을 찾자.
function waitSync(ms){
var start = Date.now();
var now = start;
while(now - start < ms){
now = Date.now();
}
} // 현재 시각과 시작 시간을 비교하며 ms범위 내에서 무한 루프를 도는 blocking 함수이다.
function drink(person, coffee){
console.log(person + '는' + coffee + '를 마십니다.');
}
function orderCoffeeSync(coffee){
console.log(coffee + '가 접수되었습니다.');
waitSync(2000); //2초 기다림
return coffee;
}
let customers = [{
name: 'Steve',
request: '카페라떼'
},{
name: 'John',
request: '아메리카노'
}]
// call syncronously
customers.forEach(function(customer){
let coffee = orderCoffeeSync(customer.request);
drink(customer.name, coffee);
});
아래는 출력결과이다.
동기 함수의 과정이 순차적으로 수행되는 것을 확인할 수 있다.
카페라떼가 접수되었습니다.
Steve는카페라떼를 마십니다.
아메리카노가 접수되었습니다.
John는아메리카노를 마십니다.
undefined
function waitAsync(callback, ms){
// 특정 시간 이후에 callback 함수가 실행되게 끔 하는 브라우저 내장 기능이다.
setTimeout(callback,ms);
}
function drink(person, coffee){
console.log(person + '는' + coffee + '를 마십니다.');
}
let customers = [{
name: 'Steve',
request: '카페라떼'
},{
name: 'John',
request: '아메리카노'
}]
function orderCoffeeAsync(menu, callback){
console.log(menu + '가 접수되었습니다.');
waitAsync(function(){
callback(menu);
},2000); // 2초 기다림
}
// call Asyncronously
customers.forEach(function(customer){
orderCoffeeAsync(customer.request, function(coffee){ // callback pattern
drink(customer.name, coffee);
});
});
아래는 출력결과이다.
주문이 동시에 수행되고, 주문에 대한 callback이 나중에 수행되는 것을 확인할 수 있다.
카페라떼가 접수되었습니다.
아메리카노가 접수되었습니다.
undefined
Steve는카페라떼를 마십니다.
John는아메리카노를 마십니다.
◾ DOM Element의 이벤트 핸들러
◾ 타이머
◾ 서버에 자원 요청 및 응답
Reference: 코드스테이츠