web-dev-qa-db-fra.com

paramètre "true" dans la méthode xmlHttpRequest .open ()

D'après la référence que j'ai lue dans MDN, il est écrit

Si TRUE (la valeur par défaut), l'exécution de la fonction JavaScript continuera alors que la réponse du serveur n'est pas encore arrivée.

C'est le A dans AJAX.

J'utilise AJAX mais j'étais un peu confus quand je l'ai lu. Je pense que le problème peut être que je ne comprends pas clairement le concept AJAX). Je sais bien sûr AJAX ne rafraîchit pas la page ce qui signifie que la connexion au serveur et la réponse se font complètement en arrière-plan.

Mais ce que je peux imaginer se produire selon cette référence, c'est que si j'ai un code comme celui-ci dans mon JavaScript:

//true, therefore process the function while server retrieves url
var xmlResponse;
var url = "http://example.com/file.xml";
xml_req.open("GET", url, true); 

xml_req.onreadystatechange = function() {
     if(xml_req.readyState == 4 && xml_req.status == 200) {
        if(xml_req.responseText != null)
             xmlResponse = xml_req.responseXML; //server response may not yet arrive
        else {
             alert("failed");
             return false;
        }
     };
xml_req.send(null);

Cela ne signifie-t-il pas que xmlResponse pourrait être indéfini dans le sens où le serveur récupère toujours les données? Quelqu'un pourrait-il expliquer quel est vraiment le flux de l'exécution dans la technologie AJAX? Merci d'avance.

26
Benny Tjia

J'ai écrit un article plus détaillé ici , mais c'est l'idée de base.

La définition de true signifie que vous effectuez une demande asynchrone. Cela signifie que le code ne s'arrête pas tant que la demande http n'est pas terminée. Un appel synchrone verrouille le navigateur pour que rien d'autre ne s'exécute. Cela peut causer des problèmes, donc les gens préfèrent asynchrone.

L'objet XHR nous informe de ce qu'il fait. Il nous donne les mises à jour avec l'événement onreadystatechange. Nous enregistrons une fonction avec elle afin que nous puissions garder une trace de son statut. Onreadystatechange est appelé 4 fois. Chacun avec un état différent

0 = uninitialized
1 = loading
2 = loaded
3 = interactive
4 = complete

Les données sont à notre disposition lorsque le readystate est 4.

Maintenant, dans le code que vous avez publié, il vérifie l'état complet et s'assure que l'état est 200 [ok]

if(xml_req.readyState == 4 && xml_req.status == 200){

La valeur de xmlResponse ne sera pas définie si vous essayez de l'utiliser ailleurs dans le code avant qu'il ne soit renvoyé. Un exemple

ml_req.send(null);
alert(xmlResponse );

L'un des tout premiers articles sur l'article XMLHttpRequest pourrait être une bonne lecture pour vous. Article Apple sur xmlhttpreq

23
epascarello

La chose importante à comprendre est que votre gestionnaire onreadystatechange n'est pas exécuté immédiatement. Et il est exécuté plus d'une fois. Il peut être plus facile de conceptualiser, si vous divisez les pièces en fonctions individuelles:

function makeRequest(url)
{
    var xhr = new XMLHttpRequest();
    xhr.open("GET", url, true);
    xhr.onreadystatechange = receiveResponse;
    xhr.send();
}
function receiveResponse(e)
{
    if (this.readyState == 4)
    {
        // xhr.readyState == 4, so we've received the complete server response
        if (this.status == 200)
        {
            // xhr.status == 200, so the response is good
            var response = this.responseXML;
            ...
        }
    }
}

Tout d'abord, makeRequest est appelé, puis se termine. Ensuite, dès que nous entendons quelque chose en retour du serveur, receiveResponse est appelé. Chaque fois, nous vérifions si la réponse est entièrement reçue, et ce n'est qu'alors que nous continuons à traiter cette réponse.

4
gilly3