21.11.24 자바스크립트 promise / resolve,reject / .then , .catch / try {} catch {} / async , await / useEffect + async + await
2021. 11. 24. 14:04ㆍ작업/JavaScript
// Promise란 : 비동기 작업의 단위
// 비동기 작업이 성공 : resolve 호출
// 비동기 작업이 실패 : reject 호출
// then : 해당 Promise가 성공했을 때 후속 조치 동작, 인자로 함수 받음
// catch : 해당 Promise가 실패했을 떄 후속 조치 동작, 인자로 함수 받음
// 1. resolve란
const promise1 = new Promise((resolve, reject) => {
resolve();
});
promise1
.then(() => {
console.log("비동기 작업 성공ㅋㅋ");
})
.catch(() => {
console.log("비동기 작업 실패 ㅠㅠ");
}); //콘솔 결과 비동기 작업 성공ㅋㅋ
// 2. reject란
const promise2 = new Promise((resolve, reject) => {
reject();
});
promise2
.then(() => {
console.log("비동기 작업 성공");
})
.catch(() => {
console.log("비동기 작업 실패 ㅠㅠ");
}); //콘솔 결과 비동기 작업 실패 ㅠㅠ
// 3.resolve, reject함수에 인자(값?) 전달하기
function fetchData(data){
return new Promise((resolve,reject) => {
if(data.length>0){
resolve(`${data} are downloading`);
}
else reject(new Error(`${data} downloding failed`));
});
}
const promise1 = fetchData([4,2,7]);// promise1 원래는 중복사용 안될듯? 일단 예시니까 그냥 ㄱㄱ
promise1
.then((value)=>{
console.log(value);
})
.catch((err)=>{
console.error(err);
});
const promise2 = fetchData();
promise2
.then((value)=>{
console.log(value);
})
.catch((err)=>{
console.error(err);
});
// 4. async : 저 promise를 포함한 함수를 바꾸기
// asycn함수의 리턴 값은 무조건 Promise가 나온다.
async function fetchData(data){
if(data.length>0){
return `${data} are downloading`;
}
else throw new Error(new Error(`${data} downloding failed`);
} // 밑에 부분은 동일...
// 5. await : promise가 fulfilled되든지 rejected 되든지 아무튼 간에 끝날때까지 기다리는 함수.
// 성질1 async 함수 내에서만 사용할 수 있습니다.
// 성질2 Promise가 완료될 때까지 기다립니다.
// 성질3 Promise가 resolve한 값을 내놓습니다
// 성질4 해당 Promise에서 reject가 발생한다면 예외가 발생합니다 -> try,catch구문 사용
function successReadData(){
return new Promise((resolve,reject)=>{
resolve();
})
}
async function asyncCall() {
await successReadData();
const promise1 = fetchData([1,2]);
try {
const result = await promise1; //기다려
console.log(result);
}
catch(err){
console.error(err);
}
const promise2 = fetchData([3,4,5]);
try {
const result = await promise2; //기다려
console.log(result);
}
catch(err){
console.error(err);
}
}
asyncCall();
const NewsList = () => {
const [articles, setArticles] = useState(null);
const [loading, setLoading] = useState(false);
useEffect(() => {
//async를 사용하는 함수 따로 선언
const fetchData = async () => {
setLoading(true);
try {
const response = await axios.get(
`http://newsapi.org/v2/top-headlines?country=kr&apiKey=${API_KEY}`
);
setArticles(response.data.articles);
} catch (e) {
console.log(e);
}
setLoading(false);
};
fetchData();
}, []);
//대기 중일 때
if (loading) {
return <NewsListBlock>Loading...</NewsListBlock>;
}
//아직 articles 값이 설정되지 않았을 때
if (!articles) {
return null;
}
//articles 값이 유효할 때
return (
<NewsListBlock>
{articles.map((article) => (
<NewsItem key={article.url} article={article} />
))}
</NewsListBlock>
);
};
https://yumyumlog.tistory.com/m/221
useEffect에서 async/await 사용하고 싶다면?
컴포넌트가 화면에 보이는 시점에 API 요청하고 싶다면 useEffect를 사용 (컴포넌트가 처음 렌더링 되는 시점에 API 요청) 여기서 주의할 점 useEffect에 등록하는 함수에 async를 붙이면 안된다!!!! 왜냐
yumyumlog.tistory.com
[Javascript] 비동기, Promise, async, await 확실하게 이해하기 – Under The Pencil
개요 본 글은 자바스크립트에서 Promise 에 대한 개념을 잡기 위해 작성한 글입니다. 자바스크립트의 기본 문법을 먼저 알아야 이 글을 조금 더 수월하게 보실 수 있습니다. 필자는 Node.js 기반에서
elvanov.com
'작업 > JavaScript' 카테고리의 다른 글
21.11.24 async await과 useEffect, axios.post , state, React 사용해서 API 받아오고 posting 하기 오류 수정 (0) | 2021.11.25 |
---|---|
21.11.22 JSON 객체와 JS Object의 차이 공부 및 리엑트 객체 state 중복 원소 포함하지 않게 동적 값 넣기 (0) | 2021.11.22 |
21.10.15 async await (0) | 2021.10.15 |
21.10.15 Promise (0) | 2021.10.15 |
21.10.15 동기vs비동기 예제 / Callback Hell 체험 (0) | 2021.10.15 |