AJAX는 자바스크립트를 이용하여 웹 서버와 브라우저가 비동기적으로 통신할 수 있는 개발 기법이다.
AJAX 통신을 사용하면, 페이지의 새로고침 없이도 URL에서 데이터를 가져올 수 있어서 페이지의 일부분만 업데이트가 가능하다.
const getCountry = (country) => {
const request = new XMLHttpRequest();
request.open('GET', `https://restcountries.eu/rest/v2/name/${country}`)
request.send();
// 비동기 통신 load가 모두 완료되면 실행
request.addEventListener('load', function() {
const [data] = JSON.parse(this.responseText)
})
}
getCountry('south korea')
비동기 작업을 연속으로 실행하기 위해 콜백함수를 중첩하는 것을 의미한다.
setTimeout(() => {
console.log('1 second passed');
setTimeout(() => {
console.log('2 seconds passed');
setTimeout(() => {
console.log('3 second passed');
setTimeout(() => {
console.log('4 second passed');
}, 1000);
}, 1000);
}, 1000);
}, 1000);
ES6의 promise를 통해 callback hell을 해결할 수 있다.
promise란 비동기 작업의 미래의 결과가 담길 장소이다.
비동기 작업은 시간이 지나변서 값이 변하는 특징이 있다 이를 표시하기 위해 여러 state와 cycle이 존재한다.
const getCountryData = (country) => {
fetch(`https://restcountries.com/v2/name/${country}`)
.then(response => response.json());
.then(data => console.log(data));
}
const getCountryData = (country) => {
fetch(`https://restcountries.com/v2/name/${country}`)
.then(response => response.json())
.then(data => console.log(data))
.catch(err => console.error(err))
.finally(() => console.log('finish'));
}
resolve
함수와 reject
함수를 받는다.resolve
함수를 호출하고 state를 fufilled
로 바꾼다.reject
함수를 호출하고 state를 rejected
로 바꾼다.// 콜백지옥, 코드 이해하기 힘들다.
setTimeout(() => {
console.log('waited more 1 second');
setTimeout(() => {
console.log('waited more 2 second');
setTimeout(() => {
console.log('waited more 3 second');
setTimeout(() => {
console.log('waited more 4 second');
}, 1000);
}, 1000);
}, 1000);
}, 1000);
// promisify를 통해 콜백지옥 해결
const wait = (seconds) => {
return new Promise((resolve) => {
setTimeout(resolve, seconds*1000);
})
}
wait(1)
.then(() => {
console.log('Wait for 1 seconds');
// promise를 리턴해서 then 메서드로 처리
return wait(1);
})
.then(() => {
console.log('waited for 2 seconds');
return wait(1);
})
.then(() => {
console.log('waited for 3 seconds');
return wait(1);
})
const test = async () => {
try {
const data = await getData();
console.log(data);
} catch(err) {
console.error(err);
}
}
(async funciton() {
try {
const data = await getData();
} catch(err) {
console.error(error);
}
})();
const getJSON = function (url) {
return fetch(url).then(response => {
return response.json();
})
}
// 3개의 promise를 동시에 처리하고 3개의 결과를 동시에 받는다.
(async function () {
const res = await Promise.all([
getJSON(`https://restcountries.com/v2/name/italy`),
getJSON(`https://restcountries.com/v2/name/egypt`),
getJSON(`https://restcountries.com/v2/name/mexico`),
])
})()
// 일정 시간이 지나면 error를 리턴
const timeout = function (sec) {
return new Promise((resolve, reject) {
setTimeout(() => {
reject(new Error('Request took too long!'))'
}, sec*1000);
})
}
// 1초 이상 지나면 timeout promise가 실행
Promise.race([
getJSON(`https://restcountries.com/v2/name/tanzania`),
timeout(1),
])
.then(res => console.log(res[0]))
.catch(err => console.error(err));
Promise.allSettled([
Promise.resolve('success'),
Promise.reject('fail'),
Promise.resolve('success'),
]).then(res => console.log(res));
// 가장 먼저 fulfill된 'success2'를 리턴받는다.
Promise.any([
Promise.reject('fail'),
Promise.resolve('success2'),
Promise.resolve('success1')
])
.then(res => console.log(res))
.catch(err => console.error(err));
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/async_function
https://poiemaweb.com/js-ajax
https://poiemaweb.com/js-async
https://www.udemy.com/course/the-complete-javascript-course/