[JS] 콜백 함수 & Promise

0 0 0

콜백 함수

다른 함수의 인자로 전달되는 함수를 말합니다.

function aaa(qqq){
	...함수 로직
}

aaa( funtion() { } )

aaa( () => {} ) // 이것도 가능

위 코드에서 aaa 함수의 인자로 들어가는 function(){}를 콜백 함수라고 합니다.

API 요청이 끝난 뒤 그 결과로 다른 요청을 실행해야 할 때 콜백 함수를 사용할 수 있습니다. 예시)

function aaa(qqq){
	// 외부 API에 데이터 요청하는 로직
	// ...
	// ...
	// 요청 끝!
	const result = "요청으로 받아온 데이터 결과값"
	qqq(result) // 요청 끝나면 qqq 실행시키기
}

aaa((result) => {
	console.log("요청이 끝났습니다.")
	console.log("요청으로 받아온 데이터는" + result + "입니다")
});

예시) koreaJSON 응용

/*
	1. 1-200 랜덤 수 받아오기
    2. koreanjson.com/posts/랜덤숫자
    3. 2번 작성자가 쓴 다른 게시글 모두 보기
*/

const onClickCallback = () => {
	// es5 초기 방법
    const getXML = new XMLHttpRequest();
    getXML.open("get", `http://numbersapi.com/random?min=1&max=200`); // api를 get 방식으로 호출하기
    getXML.send();
    getXML.addEventListener("load", (res) => {
    	console.log(res); // API 요청 결과
        const num = res.target.response.split(" ")[0]; // 랜덤숫자 뽑기
        const postXML = new XMLHttpRequest();
        postXML.open("get", `https://koreanjson.com/posts/${num}`);
        postXML.send();
        postXML.addEventListener("load", (res) => {
        	console.log(res);
            const userId = JSON.parse(res.target.response).UserId;
            const postUserXML = new XMLHttpRequest();
            postUserXML.open("get", `https://koreanjson.com/posts?userId=${userId}`);
            postUserXML.send();
            postUserXML.addEventListener("load", (res) => {
            	console.log(res); // 최종 API 요청 결과
        	});
    	});
	});
};

이처럼 API 호출이 중첩될수록 콜백 함수 때문에 가독성이 크게 떨어지는데, 이를 콜백 지옥이라고 합니다.

Promise

콜백 지옥 같은 문제를 해결하기 위해 나온 것이 Promise입니다.

예시) 기본 사용법

new Promise((성공했을때함수, 실패했을떄함수) => {
     try {
         // 여기서 API 요청을 한다면??
         const response = "철수";
         성공했을때함수();
     } catch (error) {
         실패했을떄함수("실패했습니다!!!");
     }
}).then(() => {
  	// 성공시
	console.log(res); // 철수
  })
	.catch(() => {
    	// 실패시
        console.log(err); // 실패했습니다!!!
    });

예시) koreaJSON 응용

const onClickPromise = () => {
	axios
    	.get(`http://numbersapi.com/random?min=1&max=200`)
        .then((res) => {
            console.log(res);
            const num = res.data.split(" ")[0]; // 랜덤숫자 뽑기
            return axios.get(`https://koreanjson.com/posts/${num}`);
	})
    .then((res) => {
        const userId = res.data.UserId;
        return axios.get(`https://koreanjson.com/posts?userId=${userId}`);
   	})
    .then((res) => {
    	// 최종결과
        console.log(res);
	});
};

Promise를 사용하면 각 요청이 체인처럼 연결되는데,

이를 **프로미스 체이닝(Promise chaining)**이라고 합니다.

댓글 0