Wie lässt sich Javascript synchron abrufen?

Lesezeit: 3 Minuten

Benutzeravatar von Nabeel Khan
Nabel Khan

Ich verwende fetch, um Daten json von einer API abzurufen. Funktioniert gut, aber ich muss es wiederholt für verschiedene Aufrufe verwenden, daher muss es synchron sein, oder ich brauche eine Möglichkeit, die Schnittstelle zu aktualisieren, wenn der Abruf für jede Komponente abgeschlossen ist.

function fetchOHLC(yUrl){
    fetch(yUrl)
    .then(response => response.json())
    .then(function(response) {
                alert(JSON.stringify(response.query));

            var t = response.created;
            var o = response.open;
            var h = response.high;
            var l = response.low;
            var c = response.close;
        
        return {t,o,h,l,c};
    
    })
    .catch(function(error) {
        console.log(error);
    });    
}

var fetchData = fetchOHLC(yUrl);
alert(fetchData); // empty ?

Gibt es eine andere Möglichkeit, dies zu erreichen, als mit fetch? (Ich möchte nicht vorzugsweise jquery verwenden).

Vielen Dank

Bearbeiten

Die Frage bezieht sich auf fetch-api, nicht auf ajax, nicht auf jquery, also hören Sie bitte auf, sie als Duplikat dieser Fragen zu markieren, ohne sie richtig zu lesen.

  • Für die Wiedereröffnung gestimmt, da synchrone Anfragen gültige Anwendungsfälle haben. (Z.B chrome.webRequest.onBeforeRequest.addListener lässt Sie keine asynchronen Operationen durchführen und lässt Ihnen keine Wahl.)

    – Константин Ван

    21. Januar um 2:54 Uhr

Benutzeravatar von RiZKiT
RiZKiT

fetch soll nur asynchrone Aufrufe durchführen, aber es gibt einige Optionen:

Option 1

Wenn XMLHttpRequest ist auch in Ordnung, dann können Sie verwenden asynchron: falschwas einen synchronen Aufruf ausführt.

Option 2

Verwenden async/await was unter der Haube asynchron ist, sich aber synchron anfühlt, siehe https://stackoverflow.com/a/54950884/2590616

Möglichkeit 3

oder ich brauche eine Möglichkeit, die Schnittstelle zu aktualisieren, wenn der Abruf für jede Komponente abgeschlossen ist

Das klingt wie fetch + Promise.all() würde gut passen, siehe https://stackoverflow.com/a/52013616/2590616

Benutzeravatar von Matthew Robin
Matthäus Robin

Wenn Sie die Abruf-API nicht verwenden möchten, müssen Sie Rückrufe, Ereignis-Listener und XMLHttpRequest verwenden.

  • So wie es derzeit geschrieben steht, ist Ihre Antwort unklar. Bitte bearbeiten Sie, um zusätzliche Details hinzuzufügen, die anderen helfen zu verstehen, wie dies die gestellte Frage beantwortet. Weitere Informationen zum Verfassen guter Antworten finden Sie in der Hilfe.

    – Gemeinschaft
    bot

    9. Juni um 3:37

Sie müssen lediglich die Callback-Funktion als Parameter hinzufügen.

function fetchOHLC(yUrl, callback){
    fetch(yUrl)
    .then(response => response.json())
    .then(function(response) {
            alert(JSON.stringify(response.query));

            var t = response.created;
            var o = response.open;
            var h = response.high;
            var l = response.low;
            var c = response.close;
        
            callback({t,o,h,l,c});
    
    })
    .catch(function(error) {
        console.log(error);
        callback(null, error);
    });    
}

fetchOHLC(yUrl, function(response, error){
    if (response == null) {
        console.log(error);
    } else {
        var fetchData = response;
        alert(fetchData);
    }
});

Benutzeravatar von Jonas Wilms
Jonas Wilms

Wenn Sie hierher gekommen sind, weil Sie “How to make Javascript Fetch Synchronous” in eine Suchmaschine eingegeben haben:

Das macht nicht viel Sinn. Das Durchführen von Netzwerkoperationen erfordert keine CPU-Arbeit und blockiert sie daher während a fetch(...) macht wenig Sinn. Arbeiten Sie stattdessen ordnungsgemäß mit Asynchronität, wie im oben verlinkten Duplikat gezeigt.


Falls Sie wirklich eine synchrone Anfrage benötigen (was Sie nicht tun), verwenden Sie die veraltete XMLHttpRequest synchrone Variante, um MDN zu zitieren:

Hinweis: Beginnend mit Gecko 30.0 (Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27), Blink 39.0 und Edge 13 wurden synchrone Anfragen im Haupt-Thread aufgrund ihrer negativen Auswirkungen auf die Benutzererfahrung als veraltet markiert.

const request = new XMLHttpRequest();
request.open('GET', '/bar/foo.txt', false);  // `false` makes the request synchronous
request.send(null);

Weitere Informationen finden Sie unter MDN.

1430890cookie-checkWie lässt sich Javascript synchron abrufen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy