function first() {
second();
console.log('첫 번째');
}
function second() {
third();
console.log('두 번째');
}
function third() {
console.log('세 번째');
}
first();
// 세 번째 -> 두 번째 -> 첫 번째
쉽게 파악이 안된다면 호출스택을 머리속으로 그려보자
function run() {
console.log('3초 후 실행');
}
console.log('시작');
setTimeout(run, 3000);
console.log('끝');
// 시작 -> 끝 -> 3초 후 실행
비동기 함수 setTimeout(run, 3000)은 호출되면 백그라운드에 쌓인다.
호출스택에 다음 코드인 console.log('끝') 이 불려서 실행되는 와중에도 백그라운드에서 3초를 세며 자신의 동작인 run을 대기한다. ( 호출스택과 백그라운드가 동시에 작동된다.)
3초가 지나면 백그라운드에 남아있는 동작 run이 태스크 큐로 이동한다. 호출 스택에 모든게 끝나서 텅텅 비어있다면(annonymous 포함) run을 호츨스택에 올려 console.log('3초 후 실행')이 동작한다.
(Promise의 then/catch setTimeout보다 더 먼저 작동함(새치기))
let relationship1 = {
name: 'zero',
friends: ['nero', 'hero', 'xero'],
logFriends: function () {
let that = this; // relationship1을 가리키는 this를 that에 저장
this.friends.forEach(function (friend) {
console.log(that.name, friend);
});
},
};
relationship1.logFriends();
// zero nero
// zero hero
// zero xero
.
let relationship2 = {
name: 'zero',
friends: ['nero', 'hero', 'xero'],
logFriends() {
this.friends.forEach(friend => {
console.log(this.name, friend);
});
},
};
relationship2.logFriends();
즉 !!
this를 쓸거면 기존함수, this를 쓰지 않아도 되면 화살표함수 사용을 권장한다. (오해 방지)
프로미스? 내용이 실행은 되었지만 결과를 아직 반환하지 않은 객체
Then을 붙이면 결과를 반환함
실행이 완료되지 않았으면 완료된 후에 Then 내부 함수가 실행됨
Resolve(성공리턴값) -> then으로 연결
Reject(실패리턴값) -> catch로 연결
Finally 부분은 무조건 실행됨
const condition = true; // true면 resolve, false면 reject
const promise = new Promise((resolve, reject) => {
if (condition) {
resolve('성공');
} else {
reject('실패');
}
});
// 다른 코드가 들어갈 수 있음
promise
.then((message) => {
console.log(message); // 성공한 경우 실행(resolve)
})
.catch((error) => {
console.error(error); // 실패한 경우 실행(reject)
})
async function findAndSaveUser(Users) {
let user = await Users.findOne({});
user.name = 'zero';
user = awajit user.save();
user = await Users.findOne({ gender: 'm' });
// 생략
}