요청을 보낸 후 해당 요청의 응답을 받아야 다음 동작을 실행하는 방식
예시) 은행 업무를 보러가면 번호표를 뽑고 기다린 후에 차례가 되었을 때 내 업무를 볼 수 있고, 내 업무가 끝나야 다음 사람이 업무를 진행할 수 있다, 내가 업무를 보고 있는 동안 다른 업무를 보지못한다.
요청을 보낸 후 응답과 관계없이 다음 동작을 실행할 수 있는 방식
예시) 커피숍에서 커피를 주문할 때, 한사람 주문을 받고 커피를 내리고 커피를 완성해서 커피를 주고 다음 손님을 받는게 아니라, 한꺼번에 주문을 받고 한꺼번에 커피가 나간다, 그렇게 함으로 뒤에 사람이 기다리는 시간이 좀 더 줄어든다, 좀 더 효율적인 처리가 가능해진다
요청에 대한 결과를 바로 반환하는게 아니라, delay한 후 반환
function B() {
console.log("callback!")
}
function A(callback) {
callback(); // callback === B
}
A(B)
const printString = (string, callback) => {
setTimeout (
() => {
console.log(string)
callback()
},
Math.floor(Math.random() * 100) +1
)
}
const printAll = () => {
printString("A", () => { // 콜백 함수 실행 //콜백 안에서 콜백함수를 실행하는 것
printString("B", () => {
printString("C", () => {})
})
})
}
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);
return coffee;
}
let customers = [{
name: 'Steve',
request: '카페라떼'
}, {
name: 'John',
request: '아메리카노'
}];
// call synchronously
customers.forEach(function(customer) {
let coffee = orderCoffeeSync(customer.request);
drink(customer.name, coffee);
});
function watiAsync (callback, ms) {
setTimeout(callback, ms); //특정 시간 이후에 callback 함수가 실행되게끔 하는 내장 기능
}
function drink (person, coffee) {
console.log(person + '는 ' + coffe + '를 마십니다');
}
function orderCoffeeSync(coffee) {
console.log(coffee + "가 접수되었습니다");
waitSync(2000);
return coffee
}
let custoers = [{
name : "Steve",
request : "카페라떼"
}, {
name : "John",
request : "아메리카노"
}]
function orderCoffeeAsync(menu, callback) {
console.log(menu + '가 접수되었습니다');
waitAsync(function() {
callback(menu);
}, 2000);
}
// call asynchronously
customers.forEach(function(customer) {
orderCoffeeAsync(customer.request, function(coffee) {
drink(customer.name, coffee);
});
});
실행시키면 주문을 다받고, 커피가 나오는 걸 볼 수 있음