2016-09-11 4 views
10

Я только начал изучать Fetch API: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_FetchJavaScript fetch API. Почему response.json() возвращает объект обещания (вместо JSON)?

Вот фрагмент кода, который я написал, чтобы возиться с ним вокруг:

fetch('http://swapi.co/api/people/1') 
    .then(function(response) { 
    var json = response.json(); 

    console.log(json); 
    // Expected : { "name": "Luke Skywalker","height": "1.72 m", ... } 
    // Get : Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined} 
    }); 

я ожидал бы получить объект JSON из ответа .json().

Похоже на то, что вы получаете при использовании JSON.parse().

Вместо этого я получаю объект обещания.

Если я увеличить обещание церь показано здесь ...

return response.json().then(function(json) { 
     // process your JSON further 
}); 

... то он работает: В течение тогдашним метода следующего обещание это выглядит как JSON.

Почему я не могу получить данные JSON в течение() первого обещания?

Может кто-нибудь объяснить, что здесь происходит?

Я бы очень признателен.

+1

То, что большинство людей не в состоянии упомянуть, что, решая, как только вы получите заголовки, вы можете начать делать что-то с этой информацией. Скажите, если вы получите 400 и гигантскую стену текста (не знаете, почему это было бы так), но вы могли бы сразу попробовать резервный вызов или обработать его, а не тратить время на получение всего тела ответа. – 1mike12

ответ

7

потому response.json() возвращает другое обещание (которое находится в пределах вашего тела функции)

https://developer.mozilla.org/en-US/docs/Web/API/Body/json

+0

Удивительный. Спасибо, что, по крайней мере, объясняет поведение. И тогда я должен позвонить другому, чтобы получить результат второго обещания. Я просто спрашиваю себя, какая польза от всего этого гнездования? –

+1

хорошо, причины довольно просты: вы используете обещания, когда у вас есть асинхронные, потенциально длительные операции. в вашем случае есть 2 таких действия: 1) выборка (которая получает сетевой ресурс, который может занять много времени и завершает его до ответа после выполнения), и 2) .json(), который принимает поток ответа и разрешает его json-объекту после его завершения (которые также могут быть длинными). так как обе используют обещания, которые вам нужны. then() на обоих, если вы хотите работать с объектами, которые они разрешают. –

+0

Получите это. Из-за вашего комментария. :) Огромное спасибо ! –