2021년 3월 6일 (비동기 프로그래밍)
Callback
콜백이 무엇인지에 대해서 몰랐다.
유트브를 보았다.
"use strict";
JavaScript is synchornous.
Execude the code block by orfer after hoisting.
hoisting: var, function declaration
console.log("1");
setTimeout(function () {
console.log("2");
}, 1000);
console.log("3");
"use strict";
// JavaScript is synchornous.
// Execude the code block by orfer after hoisting.
// hoisting: var, function declaration
console.log("1");
setTimeout(() => console.log("2"), 1000);
console.log("3");
// Synchronous callback
function printImmediately(print) {
print();
}
printImmediately(() => console.log("hello"));
// Asynchronous callback
function printWithDelay(print, timeout) {
setTimeout(print, timeout);
}
printWithDelay(() => console.log("async callback"), 2000);
// Callback Hell example
class UserStorage {
loginUser(id, password, onSuccess, onError) {
setTimeout(() => {
if (
(id === "ellie" && password === "dream") ||
(id === "color" && 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} role`
);
},
(error) => {
console.log(error);
}
);
},
(error) => {
console.log(error);
}
);
Promise
https://www.youtube.com/watch?v=JB_yU6Oe2eE&list=PLv2d7VI9OotTVOL4QmPfvJWPJvkmv6h-2&index=13
"use strict";
//Promise is a JavaScript object for asynchronous operation.
//state: pending -> fulfilled or rejected
//Producer vs Consumer
//1. Producer
//when new Promise is created, teh executor runs automatically.
const promise = new Promise((resolve, reject) => {
// doing some heavy work(network, read files_
console.log("doing something...");
setTimeout(() => {
resolve("ellie");
// reject(new Error("no network"));
}, 2000);
});
2. Consumers: then, catch, finally
promise
.then((value) => {
console.log(value);
})
.catch((error) => {
console.log(error);
})
.finally(() => console.log("finally"));
//3. Promise chaining
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));
//4. Error Handling
const getHen = () =>
new Promise((resolve, reject) => {
setTimeout(() => resolve("🐔", 1000));
});
const getEgg = (hen) =>
new Promise((resolve, reject) => {
setTimeout(() => resolve(`${hen} => 🥚`), 1000);
});
const cook = (egg) =>
new Promise((resolve, reject) => {
setTimeout(() => resolve(`${egg} => 🍳`, 1000));
});
getHen()
.then((hen) => getEgg(hen))
.then((egg) => cook(egg))
.then((meal) => console.log(meal));
reject 부분을 살펴보면
const getEgg = (hen) =>
new Promise((resolve, reject) => {
setTimeout(() => reject(new Error(`error! ${hen} => 🥚`)), 1000);
});
getHen() //
.then(getEgg)
.catch((error) => {
return "🍞";
})
.then(cook)
.then(console.log)
.catch(console.log);
중간에 에러가 있을시 빵을 받아온다라는 것을 넣어줄수도 있다.
callback-to-promise
콜백 지옥인 코드를 프로미스로 만들 수 있다.
class UserStorage {
loginUser(id, password) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (
(id === "ellie" && password === "dream") ||
(id === "color" && 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(userStorage.getRoles)
.then((user) => alert(`Hello ${user.name}, you have a ${user.role} role`))
.catch(console.log);
async와 await
//async & await
//clear style of using promise :)
//1. async
function fetchUser() {
return new Promise((resolve, reject) => {
// do network request in 10 secs....
resolve("ellie");
});
}
const user = fetchUser();
user.then(console.log);
console.log(user);
async function fetchUser() {
// do network request in 10 secs....
return "ellie";
}
//async & await
//clear style of using promise :)
//1. async
function fetchUser() {
return new Promise((resolve, reject) => {
// do network request in 10 secs....
resolve("ellie");
});
}
const user = fetchUser();
user.then(console.log);
console.log(user);
async function fetchUser() {
// do network request in 10 secs....
return "ellie";
}
간단하게 바뀐다.
// 2. await
function delay(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function getApple() {
await delay(3000);
return "🍎";
}
async function getBanana() {
await delay(3000);
return "🍌";
}
function pickFruits() {
return getApple().then((apple) => {
return getBanana().then((banana) => `${apple} + ${banana}`);
});
}
async function pickFruits() {
const apple = await getApple();
const banana = await getBanana();
return `${apple} + ${banana}`;
}
pickFruits().then(console.log);
--> 비동기적인 요소들을 await로 관리해준다.
하지만 위에것들은 3초 3초 6초를 기다려야하니까
-> 병렬적으로 만들어준다.
-> Promise
async function pickFruits() {
const applePromise = getApple();
const bananaPromise = getBanana();
const apple = await applePromise;
const banana = await bananaPromise;
return `${apple} + ${banana}`;
}
//3. useful Promise APIs
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);
Author And Source
이 문제에 관하여(2021년 3월 6일 (비동기 프로그래밍)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jtlim0414/2021년-3월-6일-비동기-프로그래밍저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)