Return ergibt undefined?

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:

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

Woher ich das weiß:Berufserfahrung – Software Entwickler / Devops
Fabboy 
Fragesteller
 27.12.2021, 12:06

habs ausprobiert ist immer noch undefined

0
Fabboy 
Fragesteller
 27.12.2021, 12:07

ich bekomme die respons aber ich kann sie mit dem return nicht weiter geben

0
BeamerBen  27.12.2021, 12:10
@Fabboy

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.

0
Fabboy 
Fragesteller
 27.12.2021, 12:11
@BeamerBen

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"))
0
Fabboy 
Fragesteller
 27.12.2021, 12:21
@Fabboy

Update:

function HttpReq(adress){
    fetch(adress).then(function(response) {
        return response.text().then(function(text) {
            return text
        });
})
}
0
BeamerBen  27.12.2021, 12:21
@Fabboy

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.

0
BeamerBen  27.12.2021, 12:34
@BeamerBen
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.

0