백그라운드 실행, 로딩 창, 서버요청/응답, 큰 용량의 파일 로딩 작업 등은 비동기적(non-blocking)으로 작동되어야 효율적입니다.
async/await
키워드에 대해 이해하고, 작동 원리를 이해할 수 있다.다른 함수의 전달인자(argument)로 넘겨주는 함수
예시
// callback 예시
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, indx) {
return element * element;
});
이벤트에 따른 함수
예시
// callback in action : event handler
document.querySelector('#btn').addEventListner('click', function(e) {
console.log('button clicked');
});
커피를 주문하고 커피가 나올때까지 다음 주문이 Blocking 되어 있습니다.
예시
// 동기인 경우
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(4000);
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);
}
// 카페라떼가 접수되었습니다
// (4초후)
// Steve는 카페라떼를 마십니다
// 아메리카노가 접수되었습니다
커피를 주문하고 커피가 나올때까지 다음 주문이 Non-Blocking 되어 있습니다.
예시
// 비동기인 경우
function waitASync(callback, ms) {
setTimeout(callback, ms);
} // 특정 시간 이후에 callback 함수가 실행되게끔 하는 브라우저 내장 기능입니다
function drink(person, coffee) {
console.log(person + '는 ' + coffee + '를 마십니다');
}
function orderCoffeeASync(coffee) {
console.log(coffee + '가 접수되었습니다');
waitAsync(function() {
callback(menu);
}, 4000);
]
let customers = [{
name: 'Steve',
request: '카페라떼'
}, {
name: 'John',
request: '아메리카노',
}];
//call asynchronously
customers.forEach(function(customer) {
orderCoffeeASync(customer.request, function(coffee) {
drink(customer.name, coffee);
});
}
// 카페라떼가 접수되었습니다
// 아메리카노가 접수되었습니다
// (4초후)
// Steve는 카페라떼를 마십니다
// John는 아메리카노를 마십니다
비동기 함수 전달 패턴 1: 콜백 패턴
예시
// 콜백 패턴
let request = 'caffelatte';
orderCoffeeAsync(request, function(response) {
// response -> 주문한 커피 결과
drink(response);
};
비동기 함수 전달 패턴 2: 이벤트 등록 패턴
예시
// 콜백 패턴
let request = 'caffelatte';
orderCoffeeAsync(request).onready = function(response) {
// response -> 주문한 커피 결과
drink(response);
};
// 순서를 제어하지 못하는 경우 (콜백 미사용)
const printString = (string) => {
setTimeout(
() => {
console.log(string)
},
Math.floor(Math.random() * 100) + 1
)
}
const printAll = () => {
printString('A');
printString('B');
printString('C');
}
printAll(); // 'A', 'B', 'C' 가 뒤죽 순서 뒤죽박줄으로 출력
// 순서를 제어하는 경우 (콜백 사용)
const printString = (string, callback) => {
setTimeout(
() => {
console.log(string)
callback()
},
Math.floor(Math.random() * 100) + 1
)
}
const printAll = () => {
printString('A', () => {
printString('B', () => {
printString('C', () => {})
})
})
}
printAll(); // 'A', 'B', 'C' 가 순서대로 출력
// 에러 핸들링 디자인 (전달인자는 callback 함수)
const somethingGonnaHappen = callback => {
waitingUntilSomethingHappens()
if (isSomethingGood) {
callback(null, something)
}
if (ifSomethingBad) {
callback(something, null)
}
}
// 사용
somethingGonnaHappen((err, data) => {
if (err) {
console.log('ERR!!');
return;
}
return data;
})
Promise
, async/await
에 대해 학습해야 합니다.Promise
는 클래스 입니다.return new Promise((resolve, reject) => {...}
, .then
사용// 콜백 -> Promise
const printString = (string) => {
return new Promise((resolve, reject) => {
setTimeout(
() => {
console.log(string)
resolve()
},
Math.floor(Math.random() * 100) + 1
)
})
}
const printAll = () => {
printString('A')
.then(() => {
return printString('B')
})
.then(() => {
return printString('C')
})
}
printAll(); // 'A', 'B', 'C' 가 순서대로 출력
Promise
또한 프라미스 지옥에 빠질수도 있습니다. (return 처리를 적절히 못하는 경우)Promise
와 같지만 ES6 이후 나온 아주 좋은 키워드입니다.Promise
의 'Syntatic Sugar' 즉, 문법적 설탕이라고 표현되는 키워드입니다.async/await
키워드 사용시.코드스테이츠 URClass