본문 바로가기
창고(2021년 이전)

[JS] 비동기 호출

by 측면삼각근 2019. 10. 8.
728x90
반응형

callback

- 다른 함수(A)의 전달인자(argument)로 넘겨주는 함수(B)
  -  parameter를 넘겨받는 함수(A)는 callback 함수(B)를 필요에 따라 즉시실행(synchronously)할수도 있고, 아니면 나중에 (asynchronously) 실행할 수도 있다.  

function B(){
	console.log('called at the back!');
}

function A(callback){
	callback(); // callback === B
}

A(B);

이 경우 동기적인 경우이며, 비동기적으로 호출 할 수도 있음.

 


callback in action : 반복실행하는 함수 (iterator)

[1, 2, 3].map(function(element, index){
	return element * element;
});

배열의 길이만큼 반복실행


callback in action : 이벤트에 따른 함수 (event handeler)

document.querySelector('#btn').addEventListener('click', function(e){
	console.log('button clicked');
});

 


 

함수 실행을 연결하는 것이 아니라, 함수 자체를 연결한 것이다.

//헷갈리지 말것

function handelClick(){
	console.log('button clicked');
}

// O - 올바른 케이스
// handleClick 을 reference 로 할당
document.querySelector('#btn').onclick = handleClick;

//익명함수를 할당하여 함수를 실행하고 있음.
document.querySelector('#btn').onclick = function(){
	handleClick();
}

//bind()는 함수 그 자체를 return.
document.querySelector('#btn').onclick = handleClick.bind();



//XXX - 옳지 않은 케이스
document.querySelector('#btn').onclick = handleClick();
//함수 실행을 연결하는 것이 아니라, 함수 자체를 연결해야 한다!!!
// 이 결과는 undefined 가 할당됨.

 


 

blocking vs non-blocking

전화 -blocking : 동기 문자 non-blocking : 비동기
하던 일을 멈추고 받아야한다.(blocking) 확인 후, 나중에 답장할 수 있다.(non-blocking)
요청에 대한 결과가 동시에 일어난다.
(synchronous)
요청에 대한 결과가 동시에 일어나지 않는다.
(asynchronous)

 


- 커피주문으로 알아보는 동기 vs 비동기

동기 : 요청에 대한 결과가 동시에 일어남

만일 커피 주문이 동기적으로 작동한다면 ? 

1. 손님 1이 아메리카노를 주문한다.
2. 접수를 받은 직원이 아메리카노를 내린다.
3. 직원이 손님 1에게 아메리카노를 전달한다.
4. 손님 2가 카페라떼를 주문한다.
- 손님 2는 손님 1이 아메리카노를 전달받을 때 까지 주문을 하지 못하고 대기열에 머물러있음

5. 접수를 받은 직원이 카페라떼를 만든다.
6. 직원이 손님2에게 카페라떼를 전달한다.

 


 

비동기 : 요청에 대한 결과가 동시에 일어나지 않는다.

1. 손님 1이 아메리카노를 주문한다.
    1. 접수를 받은 직원이 아메리카노를 내린다.
    2. 아메리카노가 완성되면 직원이 손님 1을 부른다. ->이벤트가 일어나면 callback!
    3. 아메리카노를 손님 1에게 전달한다.

2. 손님 2가 카페라떼를 주문한다.
    1. 접수를 받은 직원이 카페라떼를 만든다.
    2. 카페라떼가 완성되면 직원이 손님 2를 부른다. ->이벤트가 일어나면 callback!
    3. 카페라떼를 손님 2에게 전달한다.

 요청에 blocking이 없으며, 응답이 비동기적으로 이루어진다. 

예시 - 동기적 함수

//동기적 함수

function waitSyn(ms){
	var start = Date.now();
    var now = start;
    while (now - start < ms) {
    	now = Date.now();
    }
}
//현재 시각과 시작 시각을 비교하며 ms범위 내에서 무한 루프를 도는 blocking 함수
// 동기적으로 delay 해줌.

function drink(person, coffee){
	console.log(person+ '는 ' + coffee + '를 마십니다.');
}

function orderCoffeeSync(coffee){
	console.log(coffee + '가 접수되었습니다.');
    waitSync(2000);
    //2초동안 blocking - 접수 후 마시고, 접수후 마시고, 
    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초식 소요됨
});

 

예시 2 - 비동기적 함수

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(funciton(){
    	callback(menu);
    },2000);
}

//call asynchronously
Customers.forEach(function(customer){
	orderCoffeeAsync(customer.request, function(coffee){
    	drink(customer.name, coffee);
    });
});

//접수를 바로바로 하고 callback도 한번에!

비동기 함수 전달 패턴

1. callback패턴

let requset = 'caffelatte';
orderCoffeeAsync(request, function(response){
	//response -->주문한 커피 결과
    drink(response);
});

2. 이벤트 등록 패턴

let request = 'caffelatte';
orderCoffeeAsync(request).onready = function(response){
	drink(response);
};

비동기의 주요 사례

  • DOM Element 의 이벤트 핸들러
    - 마우스, 키보드 입력(click, keydown 등)
    - 페이지 로딩(DOMContentLoaded 등)
  • 타이머
    - 타이머 API(setTimeout 등)
    - 애니메이션 API (requestAnimationFrame)
  • 서버에 자원 요청 및 응답
    - fetch API
    - AJAX (XHR)

 

 


+ Advanced : 브라우저 비동기 함수 작동 원리를 알려면
event Loop와 Philip Roberts: Help, I'm stuck in an event-loop 읽어보기

반응형

'창고(2021년 이전)' 카테고리의 다른 글

[JS] 화살표 함수 => Fat Arrow Function  (0) 2019.10.25
[JS] 함수메소드(Function Methods)  (0) 2019.10.13
[JS] this  (0) 2019.10.07
[JS] DOM(Document Object Model)  (0) 2019.10.03
[JS] 매개변수 길이가 유동적일때  (0) 2019.10.01