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
RiZKiT
fetch soll nur asynchrone Aufrufe durchführen, aber es gibt einige Optionen:
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
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);
}
});
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);
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