티스토리 뷰
728x90
SMALL
promise 예제
function increase(number) {
const promise = new Promise((resolve, rejecct) => {
//resolve는 성공, reject는 실패
setTimeout(() => {
const result = number + 10;
if (result > 50) {
//50보다 높으면 에러 발생시키기
const e = new Error("NumberTooBig");
return rejecct(e);
}
resolve(result);
}, 1000);
});
return promise;
}
increase(0)
.then((number) => {
//Promise에서 resolve된 값은 .then을 통해 받아 올 수 있음
console.log(number);
return increase(number);
})
.then((number) => {
//또 .then으로 처리 가능
console.log(number);
return increase(number);
})
.then((number) => {
//또 .then으로 처리 가능
console.log(number);
return increase(number);
})
.then((number) => {
//또 .then으로 처리 가능
console.log(number);
return increase(number);
})
.then((number) => {
//또 .then으로 처리 가능
console.log(number);
return increase(number);
})
.then((number) => {
//또 .then으로 처리 가능
console.log(number);
return increase(number);
})
.then((number) => {
//또 .then으로 처리 가능
console.log(number);
return increase(number);
})
.then((number) => {
//또 .then으로 처리 가능
console.log(number);
return increase(number);
})
.catch((e) => {
//도중에 에러가 발생한다면 .catch를 통해 알 수 있음
console.log(e);
});
aynsc/await 예제
function increase(number) {
const promise = new Promise((resolve, rejecct) => {
//resolve는 성공, reject는 실패
setTimeout(() => {
const result = number + 10;
if (result > 50) {
//50보다 높으면 에러 발생시키기
const e = new Error("NumberTooBig");
return rejecct(e);
}
resolve(result);
}, 1000);
});
return promise;
}
async function runTasks() {
try {
//try catch 구문을 사용하여 에러를 처리합니다.
let result = await increase(0);
console.log(result);
result = await increase(result);
console.log(result);
result = await increase(result);
console.log(result);
result = await increase(result);
console.log(result);
result = await increase(result);
console.log(result);
result = await increase(result);
console.log(result);
result = await increase(result);
console.log(result);
} catch (e) {
console.log(e);
}
}
runTasks();
yarn create react-app news-viewer
기본 axios
import React, { useState } from "react";
import axios from "axios";
const App = () => {
const [data, setData] = useState(null);
const onClick = async () => {
try {
const response = await axios.get(
"https://jsonplaceholder.typicode.com/todos/1"
);
setData(response.data);
} catch (e) {
console.log(e);
}
// axios
// .get("https://jsonplaceholder.typicode.com/todos/1")
// .then((response) => {
// setData(response.data);
// });
};
return (
<div>
<div>
<button onClick={onClick}>불러오기</button>
</div>
{data && (
<textarea
rows={7}
value={JSON.stringify(data, null, 2)}
readOnly={true}
/>
)}
</div>
);
};
export default App;
usepromise 사용 전
import React, { useEffect, useState } from "react";
import styled from "styled-components";
import NewsItem from "./NewsItem";
import axios from "axios";
const NewsListBlock = styled.div`
box-sizing: border-box;
padding-bottom: 3rem;
width: 768px;
margin: 0 auto;
margin-top: 2rem;
@media screen and (max-width: 768px) {
width: 100%;
padding-left: 1rem;
padding-right: 1rem;
}
`;
const NewsList = ({ category }) => {
const [articles, setArticles] = useState(null);
const [loading, setLoading] = useState(false);
useEffect(() => {
//async를 사용하는 함수 따로 선언
const fetchData = async () => {
setLoading(true);
try {
const query = category === "all" ? "" : `&category=${category}`;
const response = await axios.get(
`http://newsapi.org/v2/top-headlines?country=kr${query}&apiKey=2080af345d194e12ba512f4ef0b1f62c`
);
setArticles(response.data.articles);
} catch (e) {
console.log(e);
}
setLoading(false);
};
fetchData();
}, [category]);
//대기 중일 때
if (loading) {
return <NewsListBlock>대기 중...</NewsListBlock>;
}
//아직 articles 값이 설정되지 않았을 때
if (!articles) {
return null;
}
//articles 값이 유효할 때
return (
<NewsListBlock>
{articles.map((article) => (
<NewsItem key={article.url} article={article} />
))}
</NewsListBlock>
);
};
export default NewsList;
usepromise
import { useState, useEffect } from "react";
export default function usePromise(promiseCreator, deps) {
// 대기 중/완료/실패에 대한 상태 관리
const [loading, setLoading] = useState(false);
const [resolved, setResolved] = useState(null);
const [error, setError] = useState(null);
useEffect(() => {
const process = async () => {
setLoading(true);
try {
const resolved = await promiseCreator();
setResolved(resolved);
} catch (e) {
setError(e);
}
setLoading(false);
};
process();
// eslint-disable-next-line react0hooks/exhaustive-deps
}, deps);
return [loading, resolved, error];
}
usepromise사용 후
import React from "react";
import styled from "styled-components";
import NewsItem from "./NewsItem";
import axios from "axios";
import usePromise from "../lib/usePromise";
const NewsListBlock = styled.div`
box-sizing: border-box;
padding-bottom: 3rem;
width: 768px;
margin: 0 auto;
margin-top: 2rem;
@media screen and (max-width: 768px) {
width: 100%;
padding-left: 1rem;
padding-right: 1rem;
}
`;
const NewsList = ({ category }) => {
const [loading, response, error] = usePromise(() => {
const query = category === "all" ? "" : `&category=${category}`;
return axios.get(
`http://newsapi.org/v2/top-headlines?country=kr${query}&apiKey=2080af345d194e12ba512f4ef0b1f62c`
);
}, [category]);
//대기 중일 때
if (loading) {
return <NewsListBlock>대기 중...</NewsListBlock>;
}
//아직 response 값이 설정되지 않았을 때
if (!response) {
return null;
}
//에러가 발생했을 때
if (error) {
return <NewsListBlock>에러 발생!</NewsListBlock>;
}
//response 값이 유효할 때
const { articles } = response.data;
return (
<NewsListBlock>
{articles.map((article) => (
<NewsItem key={article.url} article={article} />
))}
</NewsListBlock>
);
};
export default NewsList;
728x90
LIST
'책 > 리다기' 카테고리의 다른 글
리다기 정리8(리덕스) (0) | 2021.01.25 |
---|---|
리다기 정리7(context) (0) | 2021.01.24 |
리다기 정리5(immer, SPA) (0) | 2021.01.22 |
리다기 정리4(아이콘, 최적화) (0) | 2021.01.21 |
리다기 정리3(css) (0) | 2021.01.20 |
댓글
공지사항