Ich habe Probleme mit fetch()
, die ich verwende, um JSON abzurufen. I denke, das Problem ist, dass der Code abgeschlossen ist und versucht, auf das Array vor dem fetch()
hat tatsächlich "heruntergeladen" und verarbeitet es. Ich habe anfangs eine einfachere Version geschrieben, die zu dem gleichen Problem führte; der Großteil des Codes hier is from Google Developers.Javascript: Wie sicherzustellen, dass fetch() beendet ist, bevor Sie die Daten verwenden?
Wie unten gezeigt (SetTimeout enthalten nur das Problem zu demonstrieren) ich unterschiedliche Ergebnisse erhalten, wenn zweimal die gleiche Array-Zugriff auf eine Sekunde auseinander:
dataResultArray = requestJSONResult(searchString);
console.log(dataResultArray); // logs '[]'
console.log(dataResultArray.length); // logs '0'
setTimeout(function(){
console.log(dataResultArray); // logs the actual JSON array contents
console.log(dataResultArray.length); // logs the real array length
}, 1000);
function requestJSONResult(searchString) {
var tempArray = []
fetch(`/search/?term=${searchString}`)
.then(status)
.then(json)
.then(function(data) {
tempArray.push(...data)
}).catch(function(error) {
console.log('Request failed', error);
});
return tempArray;
}
function status(response) {
if (response.status >= 200 && response.status < 300) {
return Promise.resolve(response)
} else {
return Promise.reject(new Error(response.statusText))
}
}
function json(response) {
return response.json()
}
Google Javascript verspricht und/oder Rückrufe – yBrodsky
Sie müssen Versprechen richtig zu verwenden. Geben Sie das Versprechen Ihrer Funktion zurück und fügen Sie einen 'then'-Handler hinzu, anstatt zu versuchen, das Ergebnis in ein Array zu pushen. Es gibt keine Möglichkeit, die zuverlässig funktioniert. – Amy
Sobald Sie Versprechungen verwenden, bleiben Sie bei 'then'-Callbacks, selbst in Ihrem Hauptskript, das diese Funktionen aufruft. Sie können dort nur auf die asynchron abgerufenen Daten zugreifen. – trincot