2010-05-11 5 views
2

En utilisant un formulaire dans une boîte de dialogue, j'utilise Dojo dans jsp pour enregistrer le formulaire dans ma base de données. Une fois cette requête complétée en utilisant dojo.xhrPost(), j'envoie une autre requête pour mettre à jour une liste déroulante qui devrait inclure l'objet formulaire ajouté qui vient d'être sauvegardé, mais pour une raison quelconque, la demande de mise à jour est exécutée avant d'enregistrer le formulaire dans la base de données même si le formulaire save est appelé en premier. En utilisant Firebug, je peux voir que la requête getLocations() est terminée avant la requête sendForm(). Ceci est le code:Dans quel ordre DOJO gère-t-il les requêtes ajax?

<button type="button" id="submitAddTeamButton" dojoType="dijit.form.Button">Add Team 
        <script type="dojo/method" event="onClick" args="evt"> 

         sendForm("ajaxResult1", "addTeamForm"); 
         dijit.byId("addTeamDialog").hide(); 
         getLocations("locationsTeam"); 
        </script> 

function sendForm(target, form){ 
    var targetNode = dojo.byId(target); 

    var xhrArgs = { 
     form: form, 
     url: "ajax", 
     handleAs: "text", 
     load: function(data) { 

      targetNode.innerHTML = data; 
     }, 
     error: function(error) { 
      targetNode.innerHTML = "An unexpected error occurred: " + error; 
     } 

    } 

    //Call the asynchronous xhrGet 
    var deferred = dojo.xhrPost(xhrArgs); 
} 

function getLocations(id) { 
    var targetNode = dojo.byId(id); 

    var xhrArgs = { 
     url: "ajax", 
     handleAs: "text", 
     content: { 
      location: "yes" 
     }, 
     load: function(data) { 

      targetNode.innerHTML = data; 
     }, 
     error: function(error) { 
      targetNode.innerHTML = "An unexpected error occurred: " + error; 
     } 
    } 

    //Call the asynchronous xhrGet 
    var deferred = dojo.xhrGet(xhrArgs); 
} 

Pourquoi cela se produit-il? Est-il possible de faire en sorte que la première requête soit complète avant la seconde?

Afin de réduire les possibilités de pourquoi cela se passe j'ai essayé de définir la propriété de cache xhrGet false mais le résultat est toujours le même.

Aidez s'il vous plaît!

Répondre

4

Comme Alex a dit, les demandes asynchrones sont juste que - leur ordre n'est pas garanti. Si vous voulez garantir leur commande, vous pouvez les rendre synchrones si vous le souhaitez. Il y a une option sync: true Je pense que vous pouvez envoyer avec les arguments de demande. Cela provoque le navigateur englacement jusqu'à ce que la demande revient, il est donc recommandé à moins que vous n'avez pas d'autre option, et la demande est très rapide.

Vous pouvez également soumettre toutes les données dont vous avez besoin ainsi que les données de la demande actuelle. Par exemple, supposons que la valeur de la liste déroulante A détermine les choix de liste disponibles dans la liste déroulante B. Plutôt que de soumettre une modification lorsque la liste déroulante A est modifiée, puis actualisez les choix de la liste déroulante B, vous pouvez soumettre la valeur A au moment où la liste déroulante B est ouverte. et le traiter dans la logique du serveur qui détermine les choix de B. (Cela suppose que vous avez un widget déroulant avec les choix générés par le serveur, plutôt que d'une balise standard.)

+0

bonne idée! Cela a fonctionné et simplifié mon code. Je l'envoie maintenant comme une demande et ayant la réponse soit la liste déroulante mise à jour avec l'objet ajouté. – mm2887

3

Le premier A à Ajax signifie « asynchrone », ce qui signifie que les choses se produisent « à leur propre rythme »: le plus probable que les demandes sont envoyées dans l'ordre que vous attendez, mais ils complètent l'inverse simplement parce que le second est plus rapide. Oui, bien sûr, vous pouvez attendre de même début (envoyer) la deuxième demande jusqu'à ce que la première complète - la plus simple, il vous suffit de mettre le départ de la deuxième demande dans la fonction de rappel de la première.

+0

Je ne peux pas mettre la deuxième demande dans la fonction de rappel de la première parce que le second est utilisé dans d'autres parties du site Web où le premier ne l'est pas. Existe-t-il un moyen de contrôler dans quel ordre les réponses sont traitées? – mm2887

+0

@ mm2887, vous pouvez faire ce que vous voulez - retarder la 2ème fonction si le 1er est en cours d'exécution et n'a pas encore reçu de réponse - mais c'est désordonné et tout, si vous pouviez changer votre architecture ce serait tellement mieux. Quoi qu'il en soit, par exemple: avoir un drapeau booléen global normalement vrai. Le code le définit à false juste avant d'envoyer le premier appel ajax et revient à vrai quand cette réponse arrivera. Le second appel vérifie le drapeau, s'il est faux, il boucle en dormant pendant 100 millisecondes ou plus chaque fois jusqu'à ce qu'il devienne vrai. –

+0

Merci pour l'idée, mais il semble désordonné comme vous l'avez dit, j'ai plutôt combiné les deux demandes en une seule. – mm2887

Questions connexes