2016-09-11 17 views
10

Tôi vừa mới bắt đầu tìm hiểu các Fetch API: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_FetchAPI tìm nạp JavaScript - Tại sao response.json() trả về một đối tượng lời hứa (thay vì JSON)?

Dưới đây là một đoạn mã mà tôi đã viết để tinker xung quanh với nó:

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} 
    }); 

tôi dự kiến ​​sẽ có để có được một đối tượng JSON ngoài phản ứng .json().

Tương tự như những gì bạn nhận được khi sử dụng JSON.parse().

Thay vào đó, tôi nhận được một đối tượng lời hứa.

Nếu tôi mở rộng chuỗi lời hứa như đưa ra ở đây ...

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

... sau đó nó hoạt động: Trong đó phương pháp của lời hứa sau nó xuất hiện như json.

Tại sao tôi không thể truy xuất dữ liệu JSON trong() của lời hứa đầu tiên?

Có ai vui lòng giải thích những gì đang xảy ra ở đây không?

Tôi thực sự đánh giá cao điều đó.

+1

Điều mà hầu hết mọi người đang thất bại trong việc đề cập đến là bằng cách giải quyết càng sớm càng tốt để tiêu đề, bạn có thể bắt đầu để làm những việc với thông tin đó. Giả sử nếu bạn nhận được 400 và một bức tường văn bản khổng lồ (không chắc chắn lý do tại sao đó là một điều), nhưng bạn có thể ngay lập tức thử một cuộc gọi dự phòng hoặc xử lý nó, thay vì lãng phí thời gian để có được toàn bộ nội dung phản hồi. – 1mike12

Trả lời

7

vì response.json() trả về một lời hứa (đó là trong phạm vi cơ quan chức năng của bạn)

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

+0

Tuyệt vời. Cảm ơn ít nhất là giải thích hành vi. Và sau đó tôi phải gọi một người khác để lấy kết quả của lời hứa thứ hai. Tôi chỉ tự hỏi bản thân lợi ích của tất cả những gì làm tổ? –

+1

tốt, lý do khá đơn giản: bạn sử dụng lời hứa khi bạn có async, hoạt động chạy dài có khả năng. trong trường hợp của bạn có 2 hành động như vậy: 1) fetch (lấy tài nguyên mạng có thể mất nhiều thời gian và reaolves nó để đáp ứng một khi thực hiện) và 2) .json() mà có dòng đáp ứng và giải quyết nó để đối tượng json khi nó được thực hiện (cũng có thể dài). kể từ khi sử dụng cả hai lời hứa bạn cần. sau đó() trên cả hai nếu bạn muốn làm việc với các đối tượng mà họ giải quyết. –

+0

Tải xuống. Bởi vì bình luận của bạn. :) Cảm ơn nhiều ! –

Các vấn đề liên quan