전반적인 개념을 잡고 가자
const rabbit = {
name : 'tori',
color : 'white',
size : null,
birthday : new Date(),
jump:()=>{ console.log(`${name} can jump!`);
},
};
// object to JSON
json = JSON.stringify(rabbit);
console.log(json)
// JSON to object
json = JSON.stringify(rabbit)
const obj = JSON.parse(json)
console.log(obj)
단 jump라는 메서드는 없음..(함수)
obj는 string이라 이런거 안 됨
console.log(rabbit.birthday.getDate()) - 29
console.log(obj.birthday.getDate()) -> type error
그럼 어떻게 해?
// JSON to object
json = JSON.stringify(rabbit)
const obj = JSON.parse(json, (key, value) => {
console.log(`key : ${key}, value : ${value}`)
return key === 'birthday' ? new Date(value) : value;
});
console.log(obj)
console.log(rabbit.birthday.getDate())
console.log(obj.birthday.getDate())
선언에 상관 없이 가장 위로 끌어 올려주어 실행시키는 것.
비동기 함수들이 동작하고 있을 때 setTimeout 안에 이름 없는 함수 같이 다음 동작을 위해서 기다리고 있는 함수
console.log("1")
setTimeout(() => {
console.log("2");
}, 1000)
// 1초 뒤에 실행하래!
console.log("3")
순서 : 비동기적, 1, 3, 2
function first(a,b,callback){
let v=a*b;
callback(v);
}
first(1,2,function(v){
console.log(v); //2
})
function task(){
let val = 1+2;
console.log(val)
}
function atask(){
// atask는 setTimeout, 즉 예약 거는 것만 함(셋타임 실행)
setTimeout(function(){
let val = 1 + 2;
console.log(val)
// 얘는 setTimeout이 찍어줌.
}, 1000);
// 1초 후에 안에 함수를 실행하달라고 예약하는 코드
// 예약 걸고 실행하고 하니까 end보다 늦게 뜨는게 맞음
}
atask();
// end가 먼저 찍힘
console.log('end')
// end는 task가 종료되지 않으면 실행할 수 없음
function test (a, b) {
let result = a + b
console.log(result)
setTimeout(
function(){
console.log("Wait!");
}, 5000)
}
test(1, 3)
class UserStorage {
loginUser(id, password, onSuccess, onError){
setTimeout(()=>{
if (
(id === 'ellie' && password === 'dream')||
(id === 'coder' && password === 'academy')
){
onSuccess(id);
}else{
onError(new Error('not found'));
}
}, 2000)
}
getRoles(user, onSuccess, onError){
setTimeout(() => {
if(user === 'ellie'){
onSuccess({name : 'ellie', role : 'admin'});
}else{
onError(new Error('no access'))
}
}, 1000);
}
}
const userStorage = new UserStorage();
const id = prompt('enter your id');
const password = prompt('enter your password');
userStorage.loginUser(id, password,
(user)=>{
userStorage.getRoles(user,userWithRole => {
alert(`Hello, ${userWithRole.name}, You have a ${userWithRole.role}`)
},
error => {})
},
error =>{
console.log(error)
})
비동기 코드를 어떻게 깔끔하게 정리할까? : 프로미스부터~
논의 결과 프로젝트가 커질 경우 (비즈니스로직이 커질 경우) 위와 같은 이유가 생긴다는 것이지 아예 콜백 자체를 지양하자는 것은 아닌 것 같다.
const promise = new Promise((resolve, reject)=>{
// doing some heavy work
console.log('doing something')
// 그 순간 바로 통신, 작업 시작
// 사용자가 요청한 경우에만 해야하면..??! -> 불필요한 통신이 일어나버림..유의 ; setTimeout 등
})
promise.then((value) => {
console.log(value)
})
const promise = new Promise((resolve, reject)=>{
// doing some heavy work
console.log('doing something')
setTimeout(()=>{
reject(new Error('not network'));
}, 2000);
})
promise.then((value) => {
console.log(value)
})
>>> Uncaught (in promise) Error: not network
const fetchNumber = new Promise((resolve, reject) =>{
setTimeout(() => resolve(1), 1000);
});
fetchNumber
.then(num => num*2)
.then(num => num*3)
.then(num => {
return new Promise((resolve, reject)=>{
setTimeout(()=> resolve(num-1), 1000);
});
})
.then(num => console.log(num))
catch(console.log)
return (대체)
class UserStorage {
loginUser(id, password){
return new Promise((resolve, reject)=>{
setTimeout(()=>{
if (
(id === 'ellie' && password === 'dream')||
(id === 'coder' && password === 'academy')
){
resolve(id);
}else{
reject(new Error('not found'));
}
}, 2000);
});
}
getRoles(user){
return new Promise((resolve, reject)=>{
setTimeout(() => {
if(user === 'ellie'){
resolve({name : 'ellie', role : 'admin'});
}else{
reject(new Error('no access'))
}
}, 1000);
})
}
}
const userStorage = new UserStorage();
const id = prompt('enter your id');
const password = prompt('enter your password');
userStorage.loginUser(id, password)
.then(user => userStorage.getRoles)
.then(user=alert(`Hello, ${userWithRole.name}, You have a ${userWithRole.role}`))
.catch(console.log)
function fetchUser(){
return 'ellie'
// 10초 걸린다 치면
}
const user = fetchUser();
console.log(user)
// 비동기 처리 안 하면 진짜 10초 걸리고 다른 데이터가 표시가 안 됨
function fetchUser(){
return new Promise((resolve, reject)=>{
return 'ellie'
})
}
const user = fetchUser();
console.log(user)
>>>Promise { <pending> }
// 팬딩 상태 ; resolve, reject를 꼭 해줘야 결과가 바뀜
근데 이런걸 안 하고 바로 실행 되게 하는 방법이 async임
async function fetchUser() {
return 'ellie'
}
const user = fetchUser();
user.then(console.log);
console.log(user)
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function getApple(){
await delay(3000);
// 3000 기다줌
return 'apple'
}
async function getBanana(){
await delay(3000);
// 3000 기다려줌
return 'banana'
}
async function pickFruits(){
const apple = await getApple();
const banana = await getBanana();
return `${apple} + ${banana}`;
}
pickFruits().then(console.log);
관계 없는 사과와 바나나가 서로 기다리고 있음 -> 병렬 실행
async function pickFruits(){
const applePromise = getApple();
const bananaPromise = getBanana();
// 만들자 마자 실행함
const apple = await applePromise;
const banana = await bananaPromise;
// 되는데로 기다렸다가 바로 실행함, 독립적, 병렬적
return `${apple} + ${banana}`;
근데 이건 너무 코드가 더러움
function pickAllFruits(){
return Promise.all([getApple(), getBanana()]).then(fruits=>fruits.join(' + ')
);
}
pickAllFruits().then(console.log)
function pickOnlyOne(){
return Promise.race([getApple(), getBanana()]);
}
pickOnlyOne().then(console.log)