Un appel jQuery Ajax avec async renvoie une réponse nullXML

J’ai un code JavaScript simple qui utilise l’API Ajax pour extraire un fichier XML du serveur.

function loadXML(path, node) { var response_obj = ""; /* Fire Ajax request and get the XML */ var request_obj = ""; $.ajax({ async: true, type: "GET", url: path, dataType: "xml", success: function(XMLObj, status, resquestObj) { response_obj = XMLObj; request_obj = requestObj; }, error: function(){ alert("Unable to fire AJAX request"); } }); alert(response_obj); //<-- This is NULL if async=true /* More logic to follow which will use response_obj (XML) and render it in the 'node' argument passed. */ } 

Où, le chemin correspond à un XML valide (testé avec le validateur W3C ) et le nœud pointe vers un élément DIV de la page HTML où la réponse doit être analysée et ajoutée.

Ce dont j’ai besoin, c’est que l’appel Ajax me renvoie l’object responseXML que je vais parsingr et rendre. Pour cela, j’assigne la réponse XML à une variable locale (locale à la scope de cette fonction), puis je l’utiliserais (actuellement, je l’envoie juste pour alerter).

Maintenant, le problème est que lorsque j’utilise cette fonction avec async défini sur false , l’appel d’ alert renvoie avec succès [object XMLDocument] . Mais dès que je modifie async en true , null est imprimé par alert .

Ce que je comprends, c’est que lorsque async:true , la dernière alert est appelée avant même que le code XML ne soit renvoyé par l’appel Ajax. De même, lorsque async:false , il s’agit d’un appel sérialisé et lorsque le contrôle atteint le dernier appel d’ alert , le code XML est déjà arrivé.

Que dois-je faire pour que:

  1. J’ai la réponse Object (et request object) renvoyée par l’appel Ajax dans les variables locales pour que je puisse les utiliser. Je comprends que la fonction de rappel, si elle est loadXML avec success , aurait trois parameters, mais je ne sais pas comment revenir de cette fonction de loadXML ma fonction loadXML .
  2. Je n’ai pas besoin de convertir l’appel Ajax en synchronisation car il ne s’agit que de l’une des fonctions que je déclenche. De nombreux autres appels Ajax doivent également être émis.
  3. Ai-je raison de supposer async:false est sérialisé dans cette fonction alors async:true ne l’est pas?

oui, ce que vous avez mentionné à propos de async:true est correct. Il est donc naturel que alert() échoue si async est true et si async est false, cela fonctionnera.

Vous devez mettre alert() dans le rappel de succès.

Vous pouvez aussi faire en sorte qu’une fonction dise ajaxSuccess et l’appelle avec succès Callback() . Placez l’ alert() dans cette fonction ajaxSuccess .