2015-10-20 7 views
20

Bei Verwendung holen:
holen response.json() gibt response = undefined

fetch(REQUEST_URL, { 
     method: 'get', 
     dataType: 'json', 
     headers: { 
     'Accept': 'application/json', 
     'Content-Type': 'application/json' 
     } 
    }) 
    .then((response) => 
     { 
     response.json() // << This is the problem 
     }) 
    .then((responseData) => { // responseData = undefined 

     console.log(responseData); 
    }); 
    }).catch(function(err) { 
     console.log(err); 
     }) 
    .done(); 

Die folgenden Arbeiten funktioniert, wissen Sie, warum? :

JSON.parse(response._bodyText) 

Antwort

11

die Verkettungs Antwort wie diese aussehen sollte, insbesondere der response.json Teil. Dann sollten Sie ein Objekt zurück in console.log bekommen.

.then(response => response.json()) 
    .then(response => { 

    console.log(response); 
+1

Ich fügte '.then (response => response.json())' und es funktionierte. Können Sie mir bitte sagen, warum wird das hinzugefügt, wenn es keinen Nutzen hat? –

+2

Wenn Sie einen Callback mit geschweiften Klammern ausführen, müssen Sie response.json() 'zurückgeben. Die vereinfachte Form response => response.json() 'enthält eine implizite return-Anweisung. –

31

Holen Sie sich ein wenig schwer, um Ihren Kopf herum zu bekommen. Ich bin neu, also schießen Sie mich nicht, wenn Flammen hier sind, aber Antwortdaten sind ein anderes Versprechen, und Sie müssen Antwortdaten zurückgeben und dann dieses Versprechen mit noch einer anderen Aussage dann behandeln, wo Sie schließlich die Antwort protokollieren können, auch Ihre Rückkehr vermissen Aussagen in Ihrem Versprechen:

var makeRequest = function(){ 

    fetch('https://jsonplaceholder.typicode.com/posts/1', { 
     method: 'get', 
     dataType: 'jsonp', 
     headers: { 
      'Accept': 'application/json', 
      'Content-Type': 'application/json' 
     } 
    }) 
    .then((response) => { 
     return response.json() // << This is the problem 
    }) 
    .then((responseData) => { // responseData = undefined 
     addTestToPage(responseData.title); 
     return responseData; 
    }) 
    .catch(function(err) { 
     console.log(err); 
    }) 
} 

function addTestToPage(textToAdd){ 
    var para = document.createElement("p"); 
    var node = document.createTextNode(textToAdd); 
    para.appendChild(node); 

    var element = document.getElementsByTagName("body")[0]; 
    element.appendChild(para); 
} 

makeRequest(); 

Hoffnung, die sehen hilft: https://jsfiddle.net/byz17L4L/

+1

In meinem Fall war das 2. '.then (responseData) 'genug. Vielen Dank! – JohnnyQ

+0

Guter Punkt JohnnyQ Ich habe es aktualisiert und enthielt eine Geige davon mit nur die 2 dann –

2

weil Sie response.json() in der ersten dann nicht zurückgegeben haben.

4

Hier ist, wie es funktionierte endlich in meinem Fall aus:

fetch('http://localhost:3001/questions', { 
     method: 'GET', 
     headers: { 
     "Accept": "application/json", 
     'Content-Type': 'application/json' 
     } 
    }) 
    .then(response => { return response.json();}) 
    .then(responseData => {console.log(responseData); return responseData;}) 
    .then(data => {this.setState({"questions" : data});}) 

    .catch(err => { 
     console.log("fetch error" + err); 
    }); 
} 
-2
fetch(weatherIng + zipCode +apiKey) 
     .then(response => response.json()) 

     .then(response => { 
    console.log(response.main); 
    this.setState({ 
     weather: ((response.main.temp * (9/5))-459.67).toFixed(0), 
     humidity:((response.main.humidity * (9/5))-459.67).toFixed(0) 
    }) 

Es wird denken, dass Sie versuchen, etwas zu erklären, wenn Sie es umschließen nicht in seinem eigenen:

.then(response => { 
    console.log(response.main); 
    }) . " around the this.setState 
Verwandte Themen