End
가 먼저 나왔을까?fetch
함수에 비동기 실행이 되는 부분이 있기 때문임fetch
함수에서는 콜백이 실행되는 조건이, '리스폰스가 도착했을 때'였다면, setTimeout에서 콜백이 실행되는 조건은, '설정한 밀리세컨즈만큼의 시간이 경과했을 때'임console.log('a');
setTimeout(() => { console.log('b'); }, 2000);
console.log('c');
console.log('a');
setInterval(() => { console.log('b'); }, 2000);
console.log('c');
...
btn.addEventListener('click', function (e) { // 해당 이벤트 객체가 파라미터 e로 넘어옵니다.
console.log('Hello Codeit!');
});
// 또는 arrow function 형식으로 이렇게 나타낼 수도 있습니다.
btn.addEventListener('click', (e) => {
console.log('Hello Codeit!');
});
...
fetch
함수는 콜백을 파라미터로 바로 전달받는 게 아니라, fetch
함수가 리턴하는 어떤 객체의 then
메소드를 사용해서 콜백을 등록함fetch
함수만 형식이 다른 이유fetch
함수는 Promise
객체라는 것을 리턴하고, 이 Promise 객체는 비동기 실행을 지원하는 또 다른 종류의 문법에 해당함// 위 함수들
setTimeout(콜백, 시간)
setInterval(콜백, 시간)
addEventListener(이벤트 이름, 콜백)
// fetch 함수
fetch('https://www.google.com')
.then((response) => response.text()) // fetch 함수가 리턴하는 객체의 then 메소드를 사용해서 콜백을 등록
.then((result) => { console.log(result); });
promise
객체: 어떤 작업에 관한 '상태 정보'를 갖고 있는 객체then
메소드: 프로미스 객체의 메소드로 프로미스 객체가 pending 상태에서 fulfilled 상태가 될 때 실행할 콜백을 등록하는 메소드console.log('Start!');
fetch('https://www.google.com')
.then((response) => response.text())
.then((result) => { console.log(result); });
console.log('End');
then
메소드를 연속적으로 붙이는 것then
메소드: 새로운 프로미스 객체를 리턴함then
메소드들은 각각 별개의 프로미스 객체를 리턴함then
메소드 뒤에 또 then
을 붙여나갈 수 있음then
메소드가 리턴했던 Promise
객체(A)는 그 콜백에서 리턴한 Promise
객체(B)와 동일한 상태와 결과를 갖게 됨fetch
함수로 리스폰스를 잘 받으면, response
객체의 text
메소드는, fulfilled
상태이면서 string
타입으로 변환한 값을 JSON.parse(result);
)fetch
함수로 리스폰스를 잘 받으면, response
객체의 json
메소드는, fulfilled
상태이면서, JSON
데이터를 자바스크립트 객체로 Deserialize해서 생겨난 객체를 JSON
타입이 아니라면 에러가 발생하고 Promise
객체는 rejected 상태가 되면서 '작업 실패 정보'를 갖게 됨콜백에서 리턴한 Promise 객체로부터 새로운 Chain이 시작되기 때문에 response 객체의 text 메소드 또는 json 메소드 이후에 등장하는 then 메소드부터는 string 타입의 값이나 자바스크립트 객체를 갖고 바로 원하는 작업을 할 수 있음
const successCallback = function () { };
const errorCallback = function () { };
fetch('https://jsonplaceholder.typicode.com/users') // Promise-A
.then(successCallback, errorCallback); // Promise-B
fetch('https://jsonplaceholder.typicode.com/users')
.then((response) => response.json())
.then((result) => { console.log(result) });
// 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) });
alert
함수만 실행하고 끝나면서 이 콜백은 아무런 값도 리턴하지 않은 것과 같음undefined
를 리턴한 것으로 간주됨// 함수 정의 안 함
fetch('https://jsonplaceholder.typicode.com/users')
.then((response) => {
...
add(1, 2); // ReferenceError 발생
...
});
//인위적으로 에러 발생 시킴
fetch('https://jsonplaceholder.typicode.com/users')
.then((response) => {
...
throw new Error('failed');
...
});
Promise
객체가 rejected
상태이고, 발생한 Error
객체를 그 작업 실패 정보로 갖고 있다는 것을 알 수 있음// Internet Disconnected
fetch('https://www.google.com') // Promise-1
.then((response) => response.text()) // Promise-2
.then((result) => { console.log(result) }, (error) => { alert(error) });
fetch
함수가 리턴한 Promise-1 객체는 rejected 상태가 되기 때문에, 첫 번째 then 메소드의 두 번재 콜백이 실행되어야 함