.json ()이 프라 미스를 반환하는 이유는 무엇입니까?
나는 fetch()최근에 API를 엉망으로 만들고 약간 기발한 것을 발견했습니다.
let url = "http://jsonplaceholder.typicode.com/posts/6";
let iterator = fetch(url);
iterator
.then(response => {
return {
data: response.json(),
status: response.status
}
})
.then(post => document.write(post.data));
;
post.dataPromise객체를 반환 합니다. http://jsbin.com/wofulo/2/edit?js,output
그러나 다음과 같이 작성된 경우 :
let url = "http://jsonplaceholder.typicode.com/posts/6";
let iterator = fetch(url);
iterator
.then(response => response.json())
.then(post => document.write(post.title));
;
post여기 Object에 제목 속성에 액세스 할 수 있는 표준 이 있습니다. http://jsbin.com/wofulo/edit?js,output
그래서 내 질문은 : 왜 response.json객체 리터럴에서 약속을 반환하지만 방금 반환되면 값을 반환합니까?
response.json약속을 반환하는 이유는 무엇 입니까?
response모든 헤더가 도착하자마자 수신하기 때문입니다. 호출 .json()은 아직로드되지 않은 http 응답 본문에 대한 또 다른 약속을 제공합니다. JavaScript fetch API의 응답 객체가 약속 인 이유 도 참조하세요 . .
then핸들러 에서 프라 미스를 반환하면 왜 값을 얻 습니까?
그것이 약속이 작동하는 방식 이기 때문 입니다. 콜백에서 프라 미스를 반환하고이를 채택하는 기능은 가장 관련성이 높은 기능이며 중첩없이 체인화 할 수 있습니다.
당신이 사용할 수있는
fetch(url).then(response =>
response.json().then(data => ({
data: data,
status: response.status
})
).then(res => {
console.log(res.status, res.data.title)
}));
또는 이전 약속에 액세스 하는 다른 접근 방식 은 json 본문을 기다린 후 응답 상태를 얻기 위해 .then () 체인 을 발생시킵니다.
This difference is due to the behavior of Promises more than fetch() specifically.
When a .then() callback returns an additional Promise, the next .then() callback in the chain is essentially bound to that Promise, receiving its resolve or reject fulfillment and value.
The 2nd snippet could also have been written as:
iterator.then(response =>
response.json().then(post => document.write(post.title))
);
In both this form and yours, the value of post is provided by the Promise returned from response.json().
When you return a plain Object, though, .then() considers that a successful result and resolves itself immediately, similar to:
iterator.then(response =>
Promise.resolve({
data: response.json(),
status: response.status
})
.then(post => document.write(post.data))
);
post in this case is simply the Object you created, which holds a Promise in its data property. The wait for that promise to be fulfilled is still incomplete.
Also, what helped me understand this particular scenario that you described is the Promise API documentation, specifically where it explains how the promised returned by the then method will be resolved differently depending on what the handler fn returns:
if the handler function:
- returns a value, the promise returned by then gets resolved with the returned value as its value;
- throws an error, the promise returned by then gets rejected with the thrown error as its value;
- returns an already resolved promise, the promise returned by then gets resolved with that promise's value as its value;
- returns an already rejected promise, the promise returned by then gets rejected with that promise's value as its value.
- returns another pending promise object, the resolution/rejection of the promise returned by then will be subsequent to the resolution/rejection of the promise returned by the handler. Also, the value of the promise returned by then will be the same as the value of the promise returned by the handler.
In addition to the above answers here is how you might handle a 500 series response from your api where you receive an error message encoded in json:
function callApi(url) {
return fetch(url)
.then(response => {
if (response.ok) {
return response.json().then(response => ({ response }));
}
return response.json().then(error => ({ error }));
})
;
}
let url = 'http://jsonplaceholder.typicode.com/posts/6';
const { response, error } = callApi(url);
if (response) {
// handle json decoded response
} else {
// handle json decoded 500 series response
}
참고URL : https://stackoverflow.com/questions/37555031/why-does-json-return-a-promise
'developer tip' 카테고리의 다른 글
| Eclipse에 포함 된 외부 라이브러리로 jar를 만드는 방법은 무엇입니까? (0) | 2020.09.14 |
|---|---|
| Swift에서 뷰 컨트롤러와 다른 객체간에 데이터를 어떻게 공유합니까? (0) | 2020.09.14 |
| 스택 변수가 GCC __attribute __ ((aligned (x)))에 의해 정렬됩니까? (0) | 2020.09.14 |
| Java에서 시간 초과가있는 일부 차단 메서드를 어떻게 호출합니까? (0) | 2020.09.14 |
| C ++에 __CLASS__ 매크로가 있습니까? (0) | 2020.09.14 |