동기 & 비동기와 차이점
제어권을 넘기면(논블로킹) 다른 코드도 실행될 수 있으므로 비동기 처리가 가능하지만,
제어권을 넘기지 않으면(블로킹) 비동기 처리가 가능한 환경이어도 비동기 처리가 불가능
node = 논블로킹 모델
function first() {
console.log('First');
}
setTimeout(first, 1000); // 1000ms(1초) 뒤에 first 함수를 실행해준다.
console.log('Middle');
console.log('Last');
// Print: Middle
// Last
// First
만약 블로킹이었다면, first - middle - last 순으로 실행
자바스크립트에서 비동기 처리를 동기로 처리할 수 있게 돕는 빌트인 객체 유형
new Promise(executor);
// 예제
new Promise((resolve, reject) => {
// 명령문
});
인자로 resolve, reject가 주입(둘 중 하나 무조건 호출)
Promise.then
promise가 만들어 질 때 executor가 실행되며, executor에서 resolve 함수가 호출되기 전까지 firstPromise.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);
})
// Print: First -> 1초 뒤에 출력됩니다.
// Middle
// Last
// Resolve!
Promise.catch
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!!'
1)
const firstPromise = Promise.resolve('First');
firstPromise.then(console.log);
// Print: 'First'
2)
const 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
// 비동기 + 일반 함수
async function 함수이름() {
// 명령문
}
// 비동기 + 익명 함수
async function() {
// 명령문
}
// 비동기 + 화살표 함수
async () => {
// 명령문
}
=> 위 세가지 함수 모두 결과 값은 promise로 받는다.
function 함수이름() {
return Promise.resolve('값');
}
// 위와 아래의 함수는 같은 동작을 보여준다.
async function 함수이름2() {
return '값';
}
함수이름();
// Print: Promise { '값' }
함수이름2();
// Print: Promise { '값' }
function setTimeFunc(time) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(time, "에 해당하는 시간이 지났습니다.");
resolve();
time);
})
}
async function main() {
console.log("시작 되었습니다.");
setTimeoutFunc(1000);
console.log("종료 되었습니다.");
}
// 시작 되었습니다.
// 종료 되었습니다.
// 1000에 해당하는 시간이 지났습니다.
function setTimeFunc(time) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(time, "에 해당하는 시간이 지났습니다.");
resolve();
time);
})
}
async function main() {
console.log("시작 되었습니다.");
await setTimeoutFunc(1000);
console.log("종료 되었습니다.");
}
// 시작 되었습니다.
// 1000에 해당하는 시간이 지났습니다.
// 종료 되었습니다.