[javascript] promise로 response 객체를 가져올때 질문

조회수 2707회

안녕하세요. 아래의 코드는 JS 로 특정한 링크의 자료를 가져오려고 하는 코드입니다. 이 코드를 통해 저는 fetch 함수와 , promise 객체 , response 객체에 대해 처음 알게되었는데요 ..

const endpoint = 'https://gist.githubusercontent.com/Miserlou/c5cd8364bf9b2420bb29/raw/2bf258763cdddd704f8ffd3ea9a3e81d25e2c6f6/cities.json';

console.log(fetch(endpoint));
fetch(endpoint).then(function(res){
  console.log(res)
  console.log(res.text())
  // res.text().then(text => console.log(text));
});

res 가 response 객체를 리턴하는것 , fetch(endpoint)가 promise 객체를 리턴하는것은 이해하였습니다. 질문1) 그런데 왜 res.text()는 promise 객체를 리턴하는것인가요?

추가로 ... res.text() 가 무엇인지 알기위해서 console 창에서 response 객체를 뒤져 보았습니다. mdn을 보니 text() 함수는 body 라는 객체의 메소드이더라구요.

이미지

그런데 .. 정작 body 를 찾아보니 text() 함수는 없었고.. 아래 그림과 같이 proto 안에 있더라구요.

이미지 질문2) 아래 promise 객체안에 promiseValue 안에 response 객체가 담겨있는것처럼, response 객체 안에 res.text() 객체가 있는것인줄 알았는데 왜 proto 안에 함수로 있는것인지궁급합니다.

질문3 body객체는 무엇을 하는 객체인가요?

긴 질문을 읽어주셔서 감사합니다.

콘솔창에서 출력된 객체를 클릭하면 객체안의 키값으로 객체가 담겨있기도하고, 속성으로 value가 나오기도 하고, proto에는 함수가 담겨있는것같네요. 필연적으로 [[PromiseValue]]__proto__ 에 대해서 공부를 해보아야할것같습니다 ㅠㅠ

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 안녕하세요!

    왜 res.text()는 promise 객체를 리턴하는것인가요?

    • promise 기법은 비동기식으로 사용할때 사용되는데, 리턴될때 HTTP 응답 body가 아직 다 못가져왔기 때문입니다( yet to be loaded ).
      아마 헤더 값만 로드됐을 겁니다. 가끔 다 body까지 다 로드 되었을 수도 있죠.. 하지만 어쩔 때는 header값 만 가져왔다면 에러가 나겠지요? 그래서 값이 아닌 프로미스 객체를 리턴합니다.

    res.text() 객체가 있는것인줄 알았는데 왜 proto 안에 함수로 있는것인지궁급합니다.

    • 자바스크립트도 다른 언어 처럼 OOP 방식으로 사용하고 싶은데.. 클래스가 없었으니 상속기능이 없습니다. 그래서 프로토타입 기반으로 상속(or OOP)을 흉내냅니다

    • new 키워드를 사용해서 객체를 생성하면, 컨스트럭트 함수가 실행되고, 객체가 만들어지죠.. 이때 ProtoType 객체도 같이 만들어집니다. 그리고 새로 만들어진 객체의 _proto_ 프로퍼티를 통해 저 객체에 접근해서 다른 객체의 함수를 사용(상속)하기도 합니다. 음 .. 타고간다고 생각하시면 좋을것 같습니다. 프로토타입 부분을 따로 쫌 보시는 걸 추천 드립니다!!

    body객체는 무엇을 하는 객체인가요?

    • Request와 Response 정보를 가지고 있는 객체입니다

    쓰고보니 도움이 될지 잘 모르겠네요 ;
    수고하세요.

    • 답변해주셔서 감사합니다! 그런데 제가 res.body 를 찍어보니 ..ReadableStream {locked: false} 라고 나오고 Response 정보를 찾을수가 없더라구요 ㅠㅠ 이것은 왜 그런것인가요? 알 수 없는 사용자 2019.2.25 09:58
    • ReadableStream객체는 .json()이나 .text()로 접근할수있는데요.. 그 이유는 내부적으로 막아놨기때뮨이죠, 내부적으로 막아논 이유는 비동기이기 때문이죠 준비가 되면 lock True로 됩니다 ! 최진우 2019.2.25 10:54
    • 비동기이기 때문에 내부적으로 막아놓았다는 의미가 [[PromiseValue]] 요런 interanl property를 말씀하시는 것이지요? 답변 감사합니다아아 알 수 없는 사용자 2019.2.26 09:08
  • fetch 자체가 비동기 호출이라 promise인건 이해하실거라 믿습니다.

    하지만 그 안에서 받는 객체 또한 promise일 이유가 있을까 싶은데요. res의 body는 그 자체로 ReadableStream 객체입니다. 이걸 이용하여 실시간으로 streaming 되는 데이타 조각(chunk)들을 읽어서 컨트롤 할 수 있도록 설계되어 있습니다. 이 조각들이 모두 전송이 완료될때까지 작업은 비동기로 이루어지며 객체를 사용하는 유저는 이 완료 시점을 알아야 하므로 API구현상 promise로 리턴을 해 주는것입니다.

    prototype기반 상속은 자바스크립트에서 중요합니다. (애초에 JS 상속 개념을 class 키워드를 먼저 접하셨다면 중요하지 않을 수도 있고요.)

    원리가 궁금하시다면 prototype chain 이라는 키워드로 다른 문서들을 찾아보세요.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)