Promise,
async / await
function blocking_wait(sec, callback) {
var start_time = +new Date;
while (+new Date < (start_time + sec * 1000));
callback();
}
console.log('1초 기다려 볼까요?');
blocking_wait(1, function () {
console.log('1초가 지났어요!');
});
function non_blocking_wait(sec, callback) {
setTimeout(callback, sec * 1000);
}
console.log('1초 기다려 볼까요?');
non_blocking_wait(1, function () {
console.log('1초가 지났어요!');
});
blocking
non-blocking
차이점
- blocking_wait이 돌아가는 동안은
while 루프가 실행흐름을 잡고 놓아주지 않기 때문에
다른 이벤트 루프가 처리될 수 없음. - 반면 non_blocking_wait이 돌아가는 동안은
사용자가 페이지를 스크롤할 수도, 링크를 클릭할 수도 있다!
블로킹 코드를
작성하는 이유는
콜백지옥 때문
callback hell
blocking에서는
다음에 실행될 코드를
같은 블럭 안에서 찾을 수 있다.
non-blocking에서는
다음에 실행될 코드를
콜백으로 넘겨야 하기 때문에
들여쓰기가 깊어지게 되어,
코드가 한 눈에 들어오지 않는다.
// heaven?
blocking_wait(1);
console.log('1초가 지났어요!');
blocking_wait(1);
console.log('2초가 지났어요!');
blocking_wait(1);
console.log('3초가 지났어요!');
// hell!
non_blocking_wait(1, function () {
console.log('1초가 지났어요!');
non_blocking_wait(1, function () {
console.log('2초가 지났어요!');
non_blocking_wait(1, function () {
console.log('3초가 지났어요!');
});
});
});
Promise
미래에 존재할 거라고 예상되는 값...
을 나타내는 값!
then, catch 체인을 활용하면
들여쓰기가 깊어지지 않음!
function promise_wait(sec) {
return new Promise(
function (resolve, reject) {
setTimeout(resolve, sec * 1000);
}
);
}
promise_wait(1).then(function () {
console.log('1초가 지났어요!');
return promise_wait(1);
}).then(function () {
console.log('2초가 지났어요!');
return promise_wait(1);
}).then(function () {
console.log('3초가 지났어요!');
});
Promise... 완벽한가?
try...catch 문을 사용할 수 없음
(catch체인을 활용해야 함)
오른쪽과 같은 코드를
작성하기 까다로움
// 프로미스만 사용하면
// 이 것처럼 작성하기 어려워요...
var wait_functions = [
blocking_wait.bind(void 0, 1),
blocking_wait.bind(void 0, 1),
blocking_wait.bind(void 0, 1)
];
for (var i = 0; i < wait_functions.length; ++i) {
wait_functions[i]();
console.log((i + 1) + '초가 지났어요!');
}
// 가능은 하지만...
var wait_functions = [
promise_wait.bind(void 0, 1),
promise_wait.bind(void 0, 1),
promise_wait.bind(void 0, 1)
];
wait_functions.reduce(function (prev, curr, i) {
return prev.then(function () {
return curr().then(function () {
console.log((i + 1) + '초가 지났어요!');
});
});
}, Promise.resolve());
es7
async
await
async
async 키워드를 붙여서
함수를 선언할 수 있음.
async 키워드가 붙은 함수는
프로미스 객체를 반환.
async 함수 블록 안에서는
await 연산자를 사용할 수 있음.
await
우항에 프로미스를 받는
단항 연산자.
프로미스가 끝날 때까지
non-blocking으로 기다림.
blocking 함수 호출과 마찬가지로
try...catch나 for 블록에서
사용 가능!
Promise
with
async / await
blocking 함수를 호출하듯이
비동기 함수를 호출할 수 있다!
function promise_wait(sec) {
return new Promise(
function (resolve, reject) {
setTimeout(resolve, sec * 1000);
}
);
}
async function main() {
await promise_wait(1);
console.log('1초가 지났어요!');
await promise_wait(1);
console.log('2초가 지났어요!');
await promise_wait(1);
console.log('3초가 지났어요!');
}
main();
Promise
with
async / await
blocking 함수를 호출하듯이
비동기 함수를 호출할 수 있다!
for문, try...catch문 등을
마음껏 섞어 사용할 수 있다!
function promise_wait(sec) {
return new Promise(
function (resolve, reject) {
setTimeout(resolve, sec * 1000);
}
);
}
async function main() {
var wait_functions = [
promise_wait.bind(void 0, 1),
promise_wait.bind(void 0, 1),
promise_wait.bind(void 0, 1)
];
for (var i = 0; i < wait_functions.length; ++i) {
await wait_functions[i]();
console.log((i + 1) + '초가 지났어요!');
}
}
main();
Promise
with
async / await
blocking 함수를 호출하듯이
비동기 함수를 호출할 수 있다!
for문, try...catch문 등을
마음껏 섞어 사용할 수 있다!
function promise_wait(sec) {
return new Promise(
function (resolve, reject) {
setTimeout(resolve, sec * 1000);
}
);
}
async function main() {
setTimeout(function () {
console.log(`
기다리는 동안
다른 이벤트 루프가 돌 수 있기 때문에
사용자가 페이지를 스크롤할 수도
링크를 클릭할 수도 있다!
`);
}, 5000);
await promise_wait(1000);
console.log('이건 1000초나 지나서야 찍히겠지');
}
main();
블로킹 꺼져
Q&A
Promise,async / await
By jongchan_choi
Promise,async / await
- 763