2017-12-07 2 views
0

Ich versuche, Fetch zu verwenden, um ein JSON-Objekt von einer API abzurufen, ich möchte den endgültigen aufgelösten Wert des Objekts zurückgeben, so dass jeder, der die Funktion verwendet, direkt erhalten kann Wert, ohne dass das Versprechen, das es zurückgibt, gelöst werden muss.Einen aufgelösten Wert von 'fetch' zurückgeben

function f() { 
 
    let result = fetch(url, { 
 
     method: 'GET' 
 
    }) 
 
    .then(response => response.json()) 
 
    .then(json => { 
 
     return json 
 
    }).catch(err => { 
 
     // Error 
 
    }); 
 

 
    return result; 
 
}

Ich weiß nicht wirklich, ob dies möglich ist oder nicht, aber ich werde um Hilfe, Vielen Dank im Voraus dankbar sein.

+2

Mögliches Duplikat [Wie kann ich die Antwort von einem asynchronen Aufruf zurückkehren?] (Https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an -asynchroner Aufruf) – WilomGfx

+2

Sie können asynchronen Code nicht in synchronen Code umwandeln, deshalb gibt es überhaupt Versprechungen. – nnnnnn

+0

Sie geben bereits das Versprechen von result zurück, Sie können das tatsächliche Ergebnis nicht zurückgeben, weil es noch nicht verfügbar ist und Sie können nicht darauf warten, weil es blockiert (jhpratt antwort wartet eigentlich nicht, entweder das Ergebnis aber immer noch zurückzugeben) gibt ein Versprechen des Ergebnisses zurück). Versprechen warum und wie hier erklärt werden: https://stackoverflow.com/a/47678417/1641941 – HMR

Antwort

1

Es ist nicht möglich mit fetch. Es ist asynchron.
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch

Sie es mit alten XMLHttpRequest tun konnte, hat es das besondere Argument für die Synchronisation https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/open aufruft. Ich würde es aber nicht empfehlen, es wird dich einfrieren.

+0

Nicht sicher, ob man xmlhttp Anfrage mit sync true verwenden sollte, könnten Sie nach Salem gebracht werden und auf dem Scheiterhaufen für diese Tage verbrannt werden :-). Mit anderen Worten: Sync ist einfach keine gültige Option, am besten zu lernen, warum und wie man verspricht: https://Stackoverflow.com/a/47678417/1641941 – HMR

+0

Danke, das hat geholfen. und du hast Recht, ich denke, es ist besser, async zu verwenden und besser mit dem Versprechen umzugehen, als die Benutzeroberfläche einzufrieren. –

1

Sie können await und async verwenden, die automatisch die Promise löst und vermeidet, immer wieder zu verwenden.

async function f() { 
    let result = (await fetch(url, { 
     method: 'GET' 
    })).json(); 

    return result; 
} 
+0

Die Funktion f gibt immer noch ein Versprechen von result.json zurück, so dass der Aufrufer immer noch ".then" verwenden muss oder "async wait" verwenden muss. Dann erhält der Anrufer dieses Anrufers immer noch keinen Wert, sondern ein Versprechen. Wenn Async verwendet wird, muss der gesamte Aufruf-Stack async sein (es sei denn, Sie interessieren sich nicht für das Ergebnis, den Fehler oder wenn es fertig ist). – HMR

Verwandte Themen