FE/React
[React] S3: Javascript 응용 (2)
ajeong7038
2023. 11. 7. 18:38
`한입 크기로 잘라 먹는 리액트 (React.js)` 강의를 듣고 정리한 자료입니다.
✨ Promise | 콜백 지옥 탈출
비동기 작업이 가질 수 있는 3가지 상태
1. Pending (대기 상태)
2. Fulfilled (성공)
3. Rejected (실패)
- resolve & reject 작업
ex) 콜백 함수를 이용한 비동기 처리 핸들링
function isPositive (number, resolve, reject) {
setTimeout(() => {
if (typeof number === "number") {
// 성공 -> resolve
resolve(number >= 0 ? "양수" : "음수");
} else {
// 실패 -> reject
reject("주어진 값이 숫자형 값이 아닙니다");
}
}, 2000);
}
isPositive(
10,
(res) => {
console.log("성공적으로 수행됨 : ", res);
},
(err) => {
console.log("실패하였음 : ", err);
}
};
Promise를 이용한 비동기 처리 핸들링
function isPositive (number, resolve, reject) {
setTimeout(() => {
if (typeof number === "number") {
// 성공 -> resolve
resolve(number >= 0 ? "양수" : "음수");
} else {
// 실패 -> reject
reject("주어진 값이 숫자형 값이 아닙니다");
}
}, 2000);
}
function isPositiveP(number) {
const executor = (resolve, reject) => { // 실행자
setTimeout(() => {
if (typeof number === "number") {
// 성공 -> resolve
resolve(number >= 0 ? "양수" : "음수");
} else {
// 실패 -> reject
reject("주어진 값이 숫자형 값이 아닙니다");
}
}, 2000);
};
const asyncTask = new Promise(executor);
return asyncTask;
}
- Promise 객체의 생성자로 비동기 작업의 실질적인 실행자 함수를 전달해준다
const asyncTask = new Promise(executor);
- 작업의 결과를 Promise 객체 반환
Promise 객체의 비동기 처리 함수 사용 방법
res
.then((res)=>{
console.log("작업 성공 : ", res);
})
.catch((err) => {
console.log("작업 실패 : ", err);
});
Promise 객체로 콜백 지옥 탈출하기
1. return new Promise(...) 로 감싸기
2. 콜백 함수 없애기 (executor로 넣어줌)
-> 파라미터 없애기
-> 콜백 대신 resolve로 바꾸기
ex)
// 기존
function task(a, cb) {
setTimeout(() => {
const res = a * -1;
cb(res);
}, 2000);
}
// Promise 객체 사용
function task(a) {
return new Promise((resolve, reject) => {
setTimeout(() => {
const res = a * -1;
resolve(res);
}, 2000);
});
}
- Promise 객체로 바꾼다는 것 = 비동기적으로 동작
then chaining
// 바꾸기 전
taskA(3, 4, (a_res) => {
console.log("task A : ", a_res);
taskB(a_res, (b_res) => {
console.log("task B : ", b_res);
taskC(b_res, (c_res) => {
console.log("task C : ", c_res);
});
});
});
// 바꾼 후
taskA(5, 1)
.then((a_res) => {
console.log("A RESULT : ", a_res);
return taskB(a_res);
})
.then((b_res) => {
console.log("B RESULT : ", b_res);
return taskC(b_res);
})
.then((c_res) => {
console.log("C RESULT : ", c_res);
});
✨ async
- `async`를 붙이면 Promise 객체를 리턴하는 비동기 처리 함수가 된다
-> then도 사용 가능
- `async` 만 붙이고 리턴해도 resolve를 값으로 가진다
✨ await
- 비동기 함수 호출 앞에 붙이게 되면 await 줄은 모두 동기적으로 처리하게 된다
- async 키워드가 붙은 함수 안에서만 사용 가능
✨ API 호출
API
- JsonPlaceHolder
let response = fetch('https://jsonplaceholder.typicode.com/posts').then((res) => {
console.log(res)
};
- fetch : 자바스크립트에서 API 호출을 할 수 있도록 도와주는 내장 함수
-> then과 함께 사용
JSON으로 불러오기
async function getData() {
let rawResponse = await fetch("https://jsonplaceholder.typicode.com/posts");
let jsonResponse = await rawResponse.json();
console.log(jsonResponse);
}
getData();