Ich habe eine Funktion, die Fragen von einer externen API abruft. Ich brauche mindestens 5 Fragen in einem Array, damit meine Anwendung funktioniert.Wert von zurückgegebenen JSON überprüfen und aktualisieren, wenn falsch
function getCategoryQuestions(){
var questions = {};
var i = 0;
for (i; i < 6; i++){
$.getJSON(makeURL(), function(data){
data = data.category;
questions[data.name] = data.questions;
validQuestionsLength(questions, data.questions)
})
}
return questions;
}
I laufen validQuestionsLength wenn jedes Array Fragen zu überprüfen mindestens 5 Elemente in der Länge ist.
function validQuestionsLength(hash, array){
while (array.length < 5) {
$.getJSON(makeURL(), function(data){
data = data.category;
hash[data.name] = data.questions
array = data.questions;
})
console.log(array.length)
}
}
Ich möchte überprüfen, ob eine Länge des Arrays ist weniger als 5 und wenn ja, werde ich eine neue Ressource aus der URL holen. Ich speichere den neuen Wert im Array und überprüfe dann die Array-Länge dieses neuen Wertes. Ich möchte, dass Daten abgerufen werden, bis die Bedingung erfüllt ist.
Was passiert ist, dass, sobald die validQuestionsLength() -Methode ausgeführt wird und ich eine Array-Länge mit weniger als 5 habe, console.logging das aktuelle Array in einer Endlosschleife bleibt. Ich dachte, ich würde eine neue Ressource in Array auf jeder Schleife speichern.
Ich bin mir nicht sicher, wo mein logischer Fehler passiert.
Ich weiß, dass eine asynchrone Anforderung auftritt, so dass die console.log möglicherweise ausgeführt wird, bevor die Array-Variable zurückgesetzt wird. Ich bearbeitete meine Validierungsfunktion ein getan Rückruf umfassen auszuführen, sobald die async
function validQuestionsLength(hash, array){
if (array.length < 5) {
$.getJSON(makeURL(), function(data){
data = data.category;
hash[data.name] = data.questions
console.log("data is ", data.questions)
array = data.questions;
}).done(console.log("array is ", array))
}
}
Meine Absicht beendet hat war, um die neu geholten Daten zu Array zu speichern. Aber data.questions und das Array (das auf den Wert für data.questions zeigen sollte) sind unterschiedliche Werte. Was macht .done() in diesem Fall?
Also ist Ihr Anruf eine Frage zu einer Zeit oder N zurück? Suchst du nach fünf pro data.name oder fünf gesamt über alle data.name-Daten? Im Moment wird die Art und Weise, wie Sie es Array haben, mit jedem Anruf überschrieben, so dass Ihr Api-Anruf, wenn er fünf Elemente zurückgibt, für immer endlos wird. – Michael
Verwenden Sie 'array.push (data.questions)' anstelle von 'array = data.questions;' Ich bin mir Ihrer JSON-Struktur nicht bewusst, die Sie benötigen, um einen Index hinzuzufügen, wie 'questions [0]' oder etwas – Viney
Wenn Sie die Callback-Funktion falsch eingestellt haben, müssen Sie den Code in die Lambda-Funktion einbetten, wie bei einem Erfolgs-Callback, jetzt haben Sie das Ergebnis result von console.log als Rückruf des ** done ** -Ereignisses. So wird es jetzt noch vor dem Rückruf ausgeführt. –