오늘은 비동기호출에 관해 다시 공부하여 블로깅을 하기로했다. 저번에 진행한 scope/closer의 다음 차례이다. 한 챕터씩 나아가는건 언제나 즐거운 일이다. 주어진 일주일 동안 나는 자기관리는 물론이고, 며칠에 걸쳐서 이해가 되지 않았던 부분들도 다시 공부하면서 비교적 당황하지않고 기수에 탑승하고자 노력하고있다. 이전처럼, 또 다시 허둥대지않고 천천히, 하지만 이어나가는 것이다. 내가 날 돌보지 않으면, 내가 나를 가르치지않으면 누가 나를 교육시킬것인가. 막히는 문제들이 있더라도 내 자신을 포기하지 않는 연습을 하는것을 이번 일주일동안 하고있다. 결과가, 좋았으면 좋겠다. 4주후든, 20주 후든. 🤔
ex) 동기적으로 함수를 실행하는 경우.
function B(){
console.log('called at the back!!');
}
function A(callback){
callback(); //callback === B
}
A(B);
ex)
[1,2,3].map(function(element, index){
return element * element;
})
ex)
document.querySelector('#btn').addEventListener('click',function(e){
console.log('button clicked!');
})
function handleClick(){
console.log('sfssf');
}
document.querySelector('#btn').onclick = handleClick; //o
document.querySelector('#btn').onclick = function(){ //o
handleClick();
}
document.querySelector('#btn').onclick = handleClick(); //x. handleClick()의 실행결과는 undefined이기 때문에, 즉 리턴값이 없기때문에 함수실행을 연결하면 x!!!
//함수자체를 연결해야함.위처럼.
커피주문으로 알아보는 동기 vs 비동기
커피주문이 동기적으로 작동시..
- 손님1이 아메리카노 주문
- 접수받은 직원이 아메리카노 내림
- 직원이 손님1에게 아메리카노 전달.
- 손님2가 카페라떼를 주문. < 손님2는 손님1의 아메리카노가 다 만들어질때까지, 주문도 못하고 대기열에 있어야함.
- 접수받은 직원이 아메리카노 내림
- 직원이 손님2에게 아메리카노 전달.
커피주문이 비동기적으로 작동시..
- 손님1이 아메리카노 주문
- 접수받은 직원이 아메리카노 내림
- 완성되면 직원이 손님1을 부름. < callback
- 직원이 손님1에게 아메리카노 전달.
- 손님2가 카페라떼를 주문.
- 접수받은 직원이 카페라떼 내림
- 완성되면 직원이 손님2를 부름. < callback
- 직원이 손님2에게 아메리카노 전달.
ex) 비동기적 커피주문 예제. //갑자기 같은 예제 여러번보니 이해됨..!
let customers = [
{
name: 'Steve',
request: '카페라떼'
},{
name: 'John',
request: '아메리카노'
}
];
function waitAsync(callback, ms){
setTimeout(callback, ms); //특정시간(ms 인자)이후에 callback함수(drink)가 실행되게끔 하는 브라우저 내장기능.
}
function drink(person, coffee){ //waitAsync()가 실행된뒤 실행될 함수의 내용(즉, 콜백)
console.log(person+"는"+coffee+"를 마십니다.");
}
function orderCoffeeSync(coffee, callback(= drink)){ //사전에 쓸 함수를 먼저 작성, 후에 drink 즉 콜백작성하고,
//이를 4000ms후에 출력할것이기 때문에 waitAsync()함수를 작성하여,
//콜백, ms인자를 주어 최종적으로 호출되게 함.
console.log(coffee+"가 접수되었습니다.");
waitAsync(function(){
callback(menu);
},4000);
}
//call asychronously
customers.forEach(fuction(customers){
orderCoffeeSync(customers.request, function(coffee){
drink(customers.name, coffee);
});
});
타이머 API
setTimeout(callback, millisecond): 일정시간 후에 함수를 실행
· arguments : 실행할 callback함수, callback함수 실행 전 기다려야 할 시간(ms)
· return value : 임의의 타이머 ID
예제01)
setTimeout(function(){
console.log('1초후 실행');
},1000); //> 임의의 타이머ID : 123 출력.
예제02)
setTimeout(function(){
console.log(2);
},1000);
console.log(3); // 3이 먼저 찍히고, 1000ms이후에 2가 찍힘.
예제03)
console.log(1);
setTimeout(function(){
console.log(2);
},1000);
setTimeout(function(){
console.log(3);
},0)
console.log(4); //setTimeout()으로 기다려야할시간을 지정하지않은 것들이 바로 먼저 출력되고,
//그 후에 0초후에 실행되는 함수실행, 그리고 1초후에 실행되는 함수가 실행되는것을 볼수있다.```
예제04)
setInteval(function(){
console.log('1초'마다' 실행');
},1000); //345 >임의의 타이머ID ```
예제05)
let timer = setInterval(function(){
console.log('1초마다 실행');
},1000);
clearInteval(timer); //위의 timer가 더이상 반복실행되지 않음.
예제06) setInterval과 clearInterval의 응용
let count =0;
let timer = setInterval(function(){
console.log('1초마다 실행');
count++;
if(count === 5){
console.log('5초가 지나면 중지합니다..continue?');
clearInterval(timer);
}
},1000);
console.log(timer); //타이머ID는 임의로 122가 출력됐음.
//결과는 (1)먼저 5초 후 종료가되고, (2)후에 콘솔로그가 찍힌것을 확인할수있었음..
안녕하세요! TIL 잘 읽었습니다 :) 아쉽게도 매일 글을 남기진 못했지만 매 글마다 정말 열심히 글을 써주신 것 같아요. 글을 잘 정리해서 깔끔하게 쓰는 것도 좋지만, 하루하루의 기록으로 남기는 거이 더 중요합니다. 부족하고 아쉬운 글이라도 일단 쓰는 것에 더 집중해주셨으면 좋겠습니다. 글도, 공부도 꾸준함이 가장 중요합니다! 이전에도 소개해드렸던 글인데 일단 편한 마음으로 글을 쓰는 게 더 중요하다는 이야기의 글입니다 ㅎㅎ
https://select.ridibooks.com/article/@hsw/18?utm_source=tw&utm_medium=push&utm_campaign=inhouse