Return ergibt undefined?
Moin
ich habe mit einem projekt gestartet und in diesem projekt hole ich mir von einer Github page die version nd vergleiche sie bzw. ich wollte das. Ich habe es mit Fetch() probiert. In node.js
fetch(adress).then(r => {
return r.json()
})
und so
fetch(adress).then(r => {
console.log(r.json());
}).then(data => {
return data
})
Ich kriege aber wenn ich es console immer
undefined
zurück
1 Antwort
Vermutlich ist die Antwort die du bekommst nicht im JSON Format. Die .json() Methode versucht die Antwort als JSON zu parsen und ein Objekt zurück zu geben, wenn das nicht geht wirst du eben auch kein Objekt erhalten.
versuch mal z.B. einfach .text() ausgeben zu lassen.
Mehr zur Fetch API/Response Objekt findest du hier:
Wie meinst du nicht weiter geben? Zeig mal den Code.
Wenn du mit Promises "synchron" programmieren möchtest solltest du den await syntax nutzen. Du kannst nicht einfach Daten aus einer Promise zurückgeben, du müsstest da weitere promises chainen oder z.B. eine Funktion aufrufen.
Mein request:
function HttpReq(adress){
fetch(adress).then(function(response) {
return response.text().then(function(text) {
console.log(text)
});
})
}
Die ausgabe:
console.log(HttpReq("weg zum file"))
Also ich denke du hast da ein Denkfehler bezüglich promises, dein return ist innerhalb einer anonymen funktion, httpReq hat in deinem Beispiel kein return.
Ich denke das was du machen möchtest ist ungefähr
const httpReq = address => fetch(address).then(r => r.text()
async function myCallingFunction() {
let responseText = await httpReq
console.log(responseText)
}
Erklärung:
Promises sind Aktionen die noch nicht abgeschlossen sind. Wenn du den Text "synchron" haben möchtest müsstest du erst mal warten bis die Aktion den Text/Json zu bekommen abgeschlossen ist. Dafür musst du warten bis die fetch request abgeschlossen ist usw. in "async" code ist dieses warten mit "await" möglich.
Früher hätte man das mit einem Callback gelöst (funktion die man an httpReq übergibt und mit text dann aufgerufen wird), aber mit Promises gibt es jetzt eine praktische Standard Lösung.
let responseText = await httpReq("/")
In dem Beispiel in dieser Zeile den Aufruf vergessen zu tippen, gemeint war das natürlich so z.B.
Kuck dir mal async await an https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Async_await
und versuche noch mal Promises besser zu verstehen https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
Und versuche einfach den Scope von Funktionen besser zu verstehen und in welchen dein return muss
+
const httpReq = address => fetch(address).then(r => r.text()
Ist quasi gleichwertig zu
function httpReq(address) {
return fetch(address).then(r => r.text())
}
Falls du mit arrow function syntax nicht vertraut bist.
ich bekomme die respons aber ich kann sie mit dem return nicht weiter geben