2017-05-07 2 views
0

Ich versuche, das Ergebnis, das nächste Mal des Spiels in der Datenbank zu bekommen. Ich habe XMLHttpRequest mit 5s Verzögerung von setInterval zum Abrufen von Daten verwendet. Wenn der Status der Anfrage 200 ist. Der Code funktioniert gut. Wenn der Status jedoch nicht 200 ist, funktioniert ClearInterval nicht, aber console.log funktioniert weiterhin.clearInterval funktioniert nicht mit XMLHttpRequest

var _resInterval; 
_resInterval = setInterval(function() { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("POST", "/index.php/forms/getDDResult/" + id, true); 
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 

    xhr.onload = function() { 
    if (xhr.status === 200) { 
     var _resp = JSON.parse(xhr.responseText); 
     console.log(_resp); 

     if (parseInt(_resp.interval) >= 0) { 
     clearInterval(_resInterval); 
     restartGame(parseInt(_resp.interval)); 
     } 
    } else { 
     console.log("error"); 
     clearInterval(_resInterval); 
    } 
    }; 
    xhr.send(); 
}, 5000); 

UPDATE: rekursive Funktion

function getGameResult() { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("POST", "/index.php/forms/getDDResult/" + id, true); 
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 

    xhr.onload = function() { 
    if (xhr.status === 200) { 
     var _resp = JSON.parse(xhr.responseText); 
     console.log(_resp); 

     if (parseInt(_resp.interval) >= 0 && _resp.result != "Not available") { 
     restartGame(parseInt(_resp.interval)); 
     } else { 
     setTimeout(function() { 
      getGameResult(); 
     }, 5000); 
     } 
    } 
    }; 
    xhr.send(); 
} 

Bin ich es richtig tun, oder sollte ich es rekursive Funktion ändern? Vielen Dank.

- Lara

+0

Was meinen Sie mit "der clearInterval wird nicht funktionieren"? –

+0

@EvanTrimboli Hallo, danke, dass du mir Zeit für meine Frage gegeben hast. clearInterval wird den setInterval stoppen, oder? Es hört nicht auf, den Code auszuführen. Ich bin mir nicht sicher, ob die Verwendung der rekursiven Funktion für diese Art von Situation gut ist, aber rekursiv funktioniert gut für mich. Warten auf einige Javascript-Helden, um Wissen zu teilen: D –

Antwort

1

Das Problem ist, dass es eine Möglichkeit ist, wo die clearInterval genannt wird und ein XHR eine Antwort aussteht. Wenn der Browser die Antwort erhält, ist der Timer schon lange vorbei, muss aber noch die Antwort verarbeiten.

Wenn Sie möchten, dass Ihr periodisches XHR auf die Antwort des vorherigen wartet, bevor es einen anderen startet, ist das rekursive setTimeout eine bessere Option.

+0

Danke Joseph für Ihre Antwort. Ich habe es wirklich geschätzt. Jetzt werde ich das rekursive Timeout verwenden. –

Verwandte Themen