Achievement Goals
비동기 호출
Advanced Challenge
콜백
- 콜백함수란?다른 함수의 전달 인자로 넘겨주는 함수
콜백함수 실행되는 두가지 방법
1.iterator : 반복 실행하는 함수
2. 이벤트에 따른 함수 : 이벤트 핸들러(함수자체를 연결하는것이 포인트)
- blocking은 전화로 하던 일을 멈추고 받아야 한다. 그리고 요청에 대한 결과가 동시에 일어난다(synchronous)
- non-blocking은 문자로 확인 후, 나중에 답장할 수 있고,(non-blocking) 요청에 대한 결과가 동시에 일어나지 않는다.(asynchronous)
- 동기는 요청에 대한 결과가 동시에 일어난다. 그로므로만일 커피 주문이 동기적으로 작동된다면?
- 손님1에게 주문받고 커피만들고 주고 손님2에게 또 주문을 받고.. 동시에 손님에게 커피를 주문받지 못한다.
- 비동기는 요청에 대한 결과가 동시에 일어나지 않는다. 그러므로 커피 주문이 비동기적으로 작동된다면?
- 손님1, 손님2에게 먼저 주문을 받고 만들 수 있다. 즉 요청에 blocking(동기, 막힘)이 없다.
- 응답(제조해서 커피 손님에게 주기)은 비동기적으로 이뤄진다. 즉 주문(요청)을 받으면서 동시에 제조도 가능하다.
- 주문한 커피가 완성 = 이벤트
- 주문한 손님을 부른다 = callback(함수가 리턴된다)
전체코드
// 동기적으로 지연시키는 함수
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);
});
//실행결과
카페라떼가 접수되었습니다(2초뒤에)
Steve는 카페라떼를 마십니다
아메리카노가 접수되었습니다(2초뒤에)
John는 아메리카노를 마십니다
4-0 손님은 costomers
라는 함수에 담겨있고, 요청하는 커피종류도 담겨있다.
let customers = [{
name: 'Steve',
request: '카페라떼'
}, {
name: 'John',
request: '아메리카노'
}];
4-1 위에 손님 함수들은 대기열에 있으면서(forEach로 손님 한사람씩 주문을 받는다.)
orderCoffeeSync
함수에 인자값으로 customer.request
(손님의 주문하는 커피)를 넣고 동기적(Sync)실행하고, 실행값이 coffee
변수에 담기면 drink
함수에 인자값으로 customer.name
와 coffee
를 넣어서 실행하면 // call synchronously(비동기 호출)
customers.forEach(function(customer) {
let coffee = orderCoffeeSync(customer.request);
drink(customer.name, coffee);
});
function orderCoffeeSync(coffee) {
console.log(coffee + '가 접수되었습니다');
waitSync(2000);
return coffee;
}
drink
함수가 실행되어서 콘솔창에 커피주문자 는 요청한 커피를 마십니다라고 출력된다.function drink(person, coffee){
console.log(person + '는 ' + coffee + '를 마십니다');
}
4-3 waitSync(2000)
은 2초동안 blocking(동기)되버린다.function orderCoffeeSync(coffee) {
console.log(coffee + '가 접수되었습니다');
waitSync(2000);
return coffee;
}```
전체코드
function waitAsync(callback, ms) {
setTimeout(callback, ms); //특정 시간 이후에 callback 함수가 실행되게끔 하는 브라우저 내장 기능이다.
}
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);
}
// call Asynchronously
customers.forEach(function(customer) {
orderCoffeeAsync(customer.request, function(coffee){
drink(customer.name, coffee);
});
});
//실행결과
카페라떼가 접수되었습니다
아메리카노가 접수되었습니다(2초뒤에)
Steve는 카페라떼를 마십니다
John는 아메리카노를 마십니다
1.callback패턴(bold part)
response -> 주문한 커피 결과를 말하다.
let request = 'caffelatte';
orderCoffeeAsynce(request, function(response) {
drink(response);
});
2.이벤트 등록 패턴
response -> 주문한 커피 결과를 말한다.
let request = 'caffelatte';
orderCoffeeAsync(request).onready = function(response) {
drink(response);
};
- DOM Element의 이벤트 핸들러
- 마우스, 키보드 입력(click, keydownm등) -> DOM세션
- 페이지 로딩(DOMContentLoaded 등) -> DOM 런코 Note
- 타이머
- 타이머 API(setTimeout등) -> Timer API 세션
- 애니메이션 API(requestAnimationFrame)
-서버에 자원 요청 및 응답
- fetch API : 특정 서버에게 URL로 요청하는것 -> 서버에 요청하기 세션
- AJAX (XHR)