axios를 사용하다보니까 모르는 것들이 나와서 ajax부터 비동기, Promise까지 찾아보게 되었다.
사실 내가 궁금했던 건 클론코딩중에 promise가 없는데 왜 promise 기반이라고 하지? 하는 코드가 있었다.
getDB - 비동기 함수, main - 콜백함수
비동기처리의 결과가 필요했기 때문에 콜백함수로 비동기처리 값을 받아 결과를 표시한다.
function getDB(callback) {
// 데이터베이스로부터 3초 후에 데이터 값을 받아온 후, 콜백 함수 호출
setTimeout(() => {
const value = 100;
callback(value);
}, 3000);
}
function main() {
// 호출할 작업에 콜백 함수를 넘긴다
getDB(function(value) {
let data = value * 2;
console.log('data의 값 : ', data);
});
}
main();
클론코딩 중 코드에서 아무리 promise가 없는데 어떤 걸 promise 라고하시는거지 그렇게 강의에서 말씀하신 이유를 찾았다.!
async/await는 프로미스를 기반으로 하지만, 마치 동기 코드처럼 작성할 수 있게 해준다.
출처: https://inpa.tistory.com/entry/🌐-js-async [Inpa Dev 👨💻:티스토리]
내부적으로는 여전히 Promise를 사용해서 비동기를 처리하고, 단지 코드 작성 부분을 프로그래머가 유지보수하게 편하게 보이는 문법만 다르게 해줄 뿐이라는 것이다.
그르니까! 내가 궁금했던 'promise가 없는 어디있다는거여'의 결론
=> axios는 promise 기반을 하고 asysnc./await은 promise가 쓰일 때 문법적으로 깔끔하게 보이기 위해 사용해서 promise 객체나 용어가 보이지 않았던 것
import axios, {AxiosError} from 'axios';
try {//try에서 promise 부분은 무조건 실행
setLoading(true);
const response = await axios.post(`${Config.API_URL}/user`, {
email,
name,
password,
});
console.log(response.data);
Alert.alert('알림', '회원가입 되었습니다.');
navigation.navigate('SignIn');
} catch (error) { //에러 시 실행
const errorResponse = (error as AxiosError).response;
console.error(errorResponse);
if (errorResponse) {
Alert.alert('알림', errorResponse.data.message);
}
} finally {//실패했던 안했던 실행
setLoading(false);
}
}, [loading, navigation, email, name, password]);
또궁금해지는 게있다. .then은 어떤 기능을 하지? 이다.
async/await은 promise 객체가 사용하는 .then , .catch 메서드는 어떻게 사용되길래 async으로 보기 편하게 하나 싶었다.
여기까지 도달하려면 프로미스 객체의 상태를 알 필요가 있다.
프로미스가 생성되면, 그 작업은 이미 진행 중이고 언젠가는 성공하거나 실패할 것이다. 그 성공/실패 결과를 .then / .catch / .finally 핸들러를 통해 받아 다음 후속 작업을 수행할 수 있다. 프로미스 핸들러는 프로미스의 상태에 따라 실행되는 콜백 함수라고 보면 된다.
promise()가 호출되는 부분의 function(tableData)에서 tableData가 뭐지 싶었는데,
만일 처리가 성공하여 프로미스 객체 내부에서 resolve(data) 를 호출하게 되면, 바로 .then() 으로 이어져 then 메서드의 콜백 함수에서 성공에 대한 추가 처리를 진행한다. 이때 호출한 resolve() 함수의 매개변수의 값이 then 메서드의 콜백 함수 인자로 들어가 then 메서드 내부에서 프로미스 객체 내부에서 다룬 값을 사용할 수 있게 된다.
function getData(callback) {
// new Promise() 추가
return new Promise(function(resolve, reject) {
$.get('url 주소/products/1', function(response) {
// 데이터를 받으면 resolve() 호출
resolve(response);
});
});
}
// getData()의 실행이 끝나면 호출되는 then()
getData().then(function(tableData) {
// resolve()의 결과 값이 여기로 전달됨
console.log(tableData); // $.get()의 reponse 값이 tableData에 전달됨
});
async function func1() {
const res = await fetch(url); // 요청을 기다림
const data = await res.json(); // 응답을 JSON으로 파싱
return 1;
}
const data = func1();
console.log(data); // 프로미스 객체가 반환된다
// then 핸들러 방식
fetch(url)
.then(res => res.json()) // 응답을 JSON으로 파싱
.then(data => {
// data 처리
console.log(data);
})
// await 방식
async function func() {
const res = await fetch(url); // 요청을 기다림
const data = await res.json(); // 응답을 JSON으로 파싱
// data 처리
console.log(data);
}
func();
그래서 우리는 콜백함수, promise, async/await 을 때에 따라 맞게 잘 활용해서 사용하면된다! 뭐가 더 낫고 뭐가 더 별로인 게 아닌 거시다~
사실 모든 키워드가 깊게보면 글의 양이 더 길어질텐데 내가 궁금했던 위주로 찾아봤다. 글들은 따로 읽어봐야겠다.
두리번 거린 글들
https://axios-http.com/kr/docs/intro
https://joshua1988.github.io/web-development/javascript/promise-for-beginners/
https://inpa.tistory.com/entry/%F0%9F%8C%90-js-async
https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-%EB%B9%84%EB%8F%99%EA%B8%B0%EC%B2%98%EB%A6%AC-Promise#%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8_%ED%94%84%EB%A1%9C%EB%AF%B8%EC%8A%A4_%EA%B0%9D%EC%B2%B4
https://ko.javascript.info/promise-basics