특정 작업을 시작하고 완벽하게 다 처리하기 전에 실행 흐름이 바로 다음 코드로 넘어가고 나중에 콜백이 실행되는 것을 비동기 실행이라 한다.
동기 실행에 비해 동일한 작업을 더 빠른 시간 내에 처리할 수 있다.
console.log('Start!');
fetch('https://www.google.com')
.then((response) => response.text())
.then((result) => { console.log(result); });
console.log('End');
위의 코드에는 (response)=>response.text()
, (result)=>{console.log(result);}
두 개의 콜백이 있는데 비동기 실행에서의 실행 순서는 아래와 같다.
setTimeout
console.log('a');
setTimeout(() => { console.log('b'); }, 2000);
console.log('c');
setInterval
console.log('a');
setInterval(() => { console.log('b'); }, 2000);
console.log('c');
fetch('URL')
.then((response) => response.text(), (error) => {console.log(error); })
.then((result) => { console.log(result); });
const successCallback = function () { };
const errorCallback = function () { };
fetch('https://jsonplaceholder.typicode.com/users') // Promise-A
.then(successCallback, errorCallback); // Promise-B
fetch 메소드가 리턴하는 Promise 객체를 Promise-A 객체, then 메소드가 리턴하는 Promise 객체를 Promise-B 객체라고 할 때
fetch 함수의 작업이 성공해서 Promise-A 객체가 fulfilled 상태가 된 경우 : then 메소드 안의 "첫 번째" 콜백인 successCallback이 실행
fetch 함수의 작업이 실패해서 Promise-A 객체가 rejected 상태가 된 경우 : then 메소드 안의 "두 번째" 콜백인 errorCallback이 실행
실행된 콜백이 어떤 값을 리턴하는 경우
Promise 객체를 리턴하는 경우
fetch('https://jsonplaceholder.typicode.com/users')
.then((response) => response.json())
.then((result) => { console.log(result) });
Promise 객체 이외의 값을 리턴하는 경우
// Internet Disconnected
fetch('https://jsonplaceholder.typicode.com/users')
.then((response) => response.json(), (error) => 'Try again!')
.then((result) => { console.log(result) });
실행된 콜백이 아무 값도 리턴하지 않는 경우
// Internet Disconnected
fetch('https://jsonplaceholder.typicode.com/users')
.then((response) => response.json(), (error) => { alert('Try again!'); })
.then((result) => { console.log(result) });
실행된 콜백 내부에서 에러가 발생하는 경우
fetch('https://jsonplaceholder.typicode.com/users')
.then((response) => {
...
throw new Error('failed');
...
});
아무런 콜백도 실행되지 않는 경우
// Internet Disconnected
fetch('https://www.google.com') // Promise-1
.then((response) => response.text()) // Promise-2
.then((result) => { console.log(result) }, (error) => { alert(error) });
// Internet Disconnected
fetch('https://jsonplaceholder.typicode.com/users')
.then((response) => response.text())
.catch((error) => { console.log(error); })
.then((result) => { console.log(result); });
// Internet Disconnected
fetch('https://jsonplaceholder.typicode.com/users') // Promise-A
.then((response) => response.text()) // Promise-B
.then(undefined, (error) => { console.log(error); }) // Promise-C
.then((result) => { console.log(result); }); // Promise-D
fetch('https://friendbook.com/my/newsfeeds')
.then((response) => response.json()) // -- A
.then((result) => { // -- B
const feeds = result;
// 피드 데이터 가공...
return processedFeeds;
})
.catch((error) => { // -- C
// 미리 저장해둔 일반 뉴스를 보여주기
const storedGeneralNews = getStoredGeneralNews();
return storedGeneralNews;
})
.then((result) => { /* 화면에 표시 */ }) // -- D
.catch((error) => { /* 에러 로깅 */ }); // -- E
fetch('https://first.com', (response) => {
// Do Something
fetch('https://second.com', (response) => {
// Do Something
fetch('https;//third.com', (response) => {
// Do Something
fetch('https;//fourth.com', (response) => {
// Do Something
});
});
});
});
fetch('https://first.com')
.then((response) => {
// Do Something
return fetch('https://second.com');
})
.then((response) => {
// Do Something
return fetch('https://third.com');
})
.then((response) => {
// Do Something
return fetch('https://third.com');
});
Tomorrow better than today, Laugh at myself
- 출처 -