1) 정의
2) 목적
3) RESTful 하지 못한 경우
1) 비동기는 무슨 동기로 존재하는가?
2) 그럼 어떤 사례가 있는가?
ajax
비동기 처리의 가장 흔한 사례는 제이쿼리의 ajax이다. 제이쿼리로 실제 웹 서비스를 개발할 때 ajax 통신을 뺴놓을 수가 없다. 보통 화면에 표시할 이미지나 데이터를 서버에서 불러와 표시해야 하는데 이때 ajax통신으로 해당 데이터를 서버로부터 가져올 수 있기 때문이다.
setTimeOut()
Web API의 한 종류, 코드를 바로 실행하지 않고 지정한 시간만큼 기다렸다가 로직을 실행한다.
위 코드를 차례대로 해석하면 'Hello'를 출력하고 3초 있다가 'Bye'를 출력하고 'Hello Again'을 출력한대야하는데 실체로는 'Bye'가 가장 늦게 출력된다.
1) 기본 정의
2) 콜백 함수를 사용하는 이유!!!!!!!!
3) 마지막으로 다시 정리
그렇다면!! 비동기 처리와 콜백 함수는 궁합이 아주 좋은 친구이다. 비동기 처리 방식에 어울리는 로직을 사용할 때 콜백 함수를 사용하면 특정 로직이 끝났을 때 원하는 동작일 실행시킬 수 있다.
알고보니 fetch는 ajax의 방식 중 최신 방식이다.
비동기 방식 Ajax는 서버와 자유롭게 통신을 할 수 있고, 페이지 전체를 리렌더링 없이 작동이 가능하게 만드는 방식
fetch API는 promise 방식의 기반이다.
1) 정의
프로미스는 자바스크립트 비동기 처리에 사용되는 객체이다.
2) 왜 쓰는가?
promise는 주로 서버사이드에서 받아온 데이터를 화면에 표시할 때 사용한다. 일반적으로 web application을 구현할 때 서버 사이드에서 데이터를 요청하고 받아오기 위해 아래와 같은 API를 사용한다.
function getData(callbackFunc) {
$.get('url 주소/products/1', function(response) {
callbackFunc(response); // 서버에서 받은 데이터 response를 callbackFunc() 함수에 넘겨줌
});
}
getData(function(tableData) {
console.log(tableData); // $.get()의 response 값이 tableData에 전달됨
});
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에 전달됨
});
new Promise()
,resolve()
,then()
와 같은 프로미스 API를 사용한 구조로 바뀌었다.3) Promise의 3가지 상태(states)
promise를 사용할 때 알아야 하는 가장 기본적인 개념이 바로 프로미스의 상태이다. 여기서 말하는 상태란 프로미스의 처리 과정을 의미한다. new Promise()
로 프로미스를 생성하고 종료될 때까지 3가지 상태를 갖는다.
new Promise();
메서드를 호출하면 Pending 상태가 된다. new Promise();
메서드를 호출할 때 콜백 함수를 선언할 수 있고, 콜백 함수의 인자는 resolve
,reject
이다.resolove
를 아래와 같이 실행하면 Fulfilled 상태가 된다.new Promise(function(resolve, reject) {
resolve();
});
then()
을 이용하여 처리 결과 값을 받을 수 있다.function getData() {
return new Promise(function(resolve, reject) {
var data = 100;
resolve(data);
});
}
// resolve()의 결과 값 data를 resolvedData로 받음
getData().then(function(resolvedData) {
console.log(resolvedData); // 100
});
then()
을 이용하여 처리 결과 값을 받을 수 있다.function getData() {
return new Promise(function(resolve, reject) {
var data = 100;
resolve(data);
});
}
// resolve()의 결과 값 data를 resolvedData로 받음
getData().then(function(resolvedData) {
console.log(resolvedData); // 100
});
new Promise()
로 프로미스 객체를 생성하면 콜백 함수 인자로 resolve
와 reject
를 사용할 수 있다. reject
를 아래와 같이 호출하면 Rejected 상태가 된다.
new Promise(function(resolve, reject) {
reject();
});
그리고, 실패 상태가 되면 실패한 이유(실패 처리의 결과 값)를 catch()
로 받을 수 있다.
function getData() {
return new Promise(function(resolve, reject) {
reject(new Error("Request is failed"));
});
}
// reject()의 결과 값 Error를 err에 받음
getData().then().catch(function(err) {
console.log(err); // Error: Request is failed
});