동기(Sync) : 실행된 코드의 결과가 나올때까지 대기하는것을 말한다.
비동기(Async) : 실행된 순서와 관계 없이 결과가 나오는것을 말한다.
ex)
function first() {
console.log('First');
}
setTimeout(first, 1000); // 1000ms(1초) 뒤에 first 함수를 실행해준다.
console.log('Middle');
console.log('Last');
// Print:
// Middle
// Last
// First
// 순서를 기다리지않고 먼저 middle, last가 실행됨
excutor
(생성자) 에는 함수만 올 수 있으며 인자로 resolve
, reject
가 주입된다.
첫 번째 함수resolve
는 비동기 작업을 성공적으로 완료해 결과를 값으로 반환할 때 호출해야 하고, 두 번째 함수reject
는 작업이 실패하여 오류의 원인을 반환할 때 호출하면 됩니다. 두 번째 함수는 주로 오류 객체를 받는다.
new Promise(executor);
// 예제
new Promise((resolve, reject) => {
// 명령문
});
일반적으로 객체Object
를 생성하는 함수를 생성자Constructor
함수라고 부르게 되는데, Promise
또한 객체로 구성되어 있기 때문에 생성자 함수를 이용해 Promise
를 선언하게 된다.
function printFunc(data){
console.log(data);
}
// 생성자 함수
const obj = new Object();
const promise = new Promise(printFunc);
obj
// Print : {}
Promise
는 반드시 3가시 상태를 지니며, 대기(Pending) 상태가 아니면 프로미스의 연산이 이미 끝난 상태로 볼 수 있다.Promise
가 만들어 질 때 executor
가 실행되며, executor
에서 resolve
함수가 호출되기 전까지 firstPromise.then(...)
안에 있는 코드를 실행하지 않는다.executor
가 실행되어 resovle
된 프로미스를 Fulfilled Promise라고도 부릅니다.const timerPromise = new Promise((resolve, reject) => { // 이곳에 정의된 함수가 executor
setTimeout(() => {
console.log('First');
resolve();
}, 1000);
});
// 이 시점에서 timerPromise는 Fulfilled Promise라고 부를 수 있다.
timerPromise.then(() => {
console.log('Middle');
console.log('Last');
});
// Print: First
// Middle
// Last
Promise
안에서 resolve
가 실행 된 경우 then
메서드에 작성된 함수가 실행됩니다.const resolvePromise = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('First');
resolve('Resolve!'); // resolve를 실행할 때, 안에 데이터를 넣어줄 수 있습니다.
}, 1000);
});
resolvePromise.then((data) => {
console.log('Middle');
console.log('Last');
console.log(data); // resolve안에 담긴 data를 출력
})
// Print: First -> 1초 뒤에 출력됩니다.
// Middle
// Last
// Resolve!
Promise
에서 resolve
된 값 이용하는 방법const firstPromise = new Promise((resolve, reject) => {
resolve('First');
});
firstPromise.then((value) => {
console.log(value);
});
// Print: 'First'
Promise.resolve
함수 이용프로미스가 값을 반환하는 경우 반환되는 값은 항상 프로미스로 감싸져 있다.
const firstPromise = Promise.resolve('First');
firstPromise.then((value) => {
console.log(value);
});
// Print: 'First'
Promise.then
으로 함수형 프로그래밍 체험하기
이것이 가능한 이유는 console.log
라는 함수 뒤에 괄호를 사용해서 함수를 호출하지 않고, 함수를 그대로 then에 넘겼기 때문입니다.
const firstPromise = Promise.resolve('First');
firstPromise.then(console.log);
// Print: 'First'
Promise.then
으로 함수형 프로그래밍 체험하기 2const countPromise = Promise.resolve(0);
function increment(value) {
return value + 1;
}
const resultPromise = countPromise.then(increment).then(increment).then(increment);
resultPromise.then(console.log);
// Print: 3
Promise
안에서 에러가 throw
되거나 reject
가 실행되면 catch
메서드에 작성한 함수가 실행됩니다.const errorPromise = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('First');
reject('Error!!'); // 직접 reject를 실행하면 프로미스에서 에러가 발생한것으로 간주됩니다.
}, 1000);
});
errorPromise.then(() => {
console.log('Middle');
console.log('Last');
}).catch((error) => { // 위에서 프로미스를 에러로 지정함
console.log('에러 발생!', error);
});
// Print: '에러 발생! Error!!'
특징 : 비동기 함수는 일반 함수나 화살표 함수와 비슷하지만 두가지만 다르다.
자바스크립트는 비동기함수인게 아니라 비동기 함수를 사용할 수 있는것!!
resolve
된다.await
연산자를 사용할 수 있다. (바로 아래에서 배웁니다!)이 두가지 특징을 제외하면 기존처럼 일반 함수나, 화살표 함수처럼 사용할 수 있다.
아래 세가지 함수 모두 결과 값은 Promise로 받는다.
// 비동기 + 일반 함수
async function 함수이름() {
// 명령문
}
// 비동기 + 익명 함수
async function() {
// 명령문
}
// 비동기 + 화살표 함수
async () => {
// 명령문
}
function 함수이름() {
return Promise.resolve('값');
}
// 위와 아래의 함수는 같은 동작을 보여준다.
async function 함수이름2() {
return '값';
}
함수이름();
// Print: Promise { '값' }
함수이름2();
// Print: Promise { '값' }
await
연산자를 비동기 함수 안에서만 사용할 수 있는데, 이를 활용하면 문법이 훨씬 간결해질 수 있기때문new Promise(executor)
코드로 Promise
를 직접 생성하면 executor
가 바로 실행되는것과 달리, 비동기 함수는 함수가 실행되기 전까지 Promise
를 생성하지 되지않는다.async
함수의 반환 값은?async
함수의 결과값은 항상 Promise
객체로 resolve
되기 때문에 값은 동일.async
함수 안에서 Promise
객체를 반환하면 어떤 결과가 나올까?async
함수 안 어딘가에서 에러가 발생하지 않았다면 async
함수의 반환 값은 무조건 Promise
객체이다.