세줄 요약 :
1. 우리가 받은 Response 객체는 완전한게 아니다. 아직 데이터를 받는 중인 것이기에 Promise를 반환
2. 그래서 다 받고 난 뒤에 온전한 Response 객체상태에서 작업을 하는 것이다.
3. 그게 싫으면 await으로 기다린 이후에 .json()을 출력하면 된다.
생활코딩의 Javascript Promise를 보다가 개운치 않은 점이 있었다.
왜 Response 객체에 .json() 메서드를 실행했는데 Promise를 반환하는 걸까?
fetch('https://jsonplaceholder.typicode.com/posts')
.then(res => {
return res.json() // 여기서 Promise 객체가 나온다
})
.catch(reason => {
console.log('reason >>', reason)
})
.then(data => {
console.log('data >> ', data) // 나온 객체를 출력한다.
})
왜 도대체 res.json()은 Promise 객체를 반환하는 걸까?
이유는 간단하다.
그게 Promise의 작동 방식이기 때문이다.
무슨 말이냐면, fetch를 한 후에 날아오는 response 객체는 모든 header가 도착하자마자 우리에게 주어진다.
그 이야기는 무슨 말이냐면 아직 body가 안왔다는 것이다. ( 머리가 잘린 몸이 나중에 온다 ㄷㄷ)
그렇기 때문에 현재 자바스크립트는 해당 body 값을 '기다리고 있는 상태'인 Promise 객체를 반환하는 것이다.
중간에 기다려서 Promise 객체가 다 끝난 상태를 받고 싶지만 그건 불가능하다.
애초에 Promise를 바로 리턴해버리기 때문에 .then으로 chaining하여 실행해야한다.
참고하면 좋은 글 :
https://stackoverflow.com/questions/37555031/why-does-json-return-a-promise