2009-08-13 13 views
1

Je suis nouveau à JQuery et Ajaxvaleur renvoyée par premier appel Ajax ne figure pas dans le second appel ajax

Je suis en train d'utiliser la valeur retournée par l'appel Ajax à un autre appel Ajax. Exemple:

$.ajax({ 
    type: "POST", 
    url: "http://localhost/FormBuilder/index.php/forms/saveForm/", 
    async: false, 
    data: "formname="+formname+"&status="+status, 
    success: function(msg){ 
     //alert("Data Saved: " + msg);       
     getformid=msg; 
    }//success 
});//ajax 

$("#fb_contentarea_col1down21 div").each(function() { 
    alert("Form id "+getformid);//alerts me the Formid returned from the Cakephp controller side 
    var checked="false"; 
    var id=$(this).attr("id"); 
    var fsize=$("#input"+id+"").width(); 
    var ftype=$("#input"+id+"").attr('data-attr'); 
    var finstr=$("#instr"+id+"").text(); 
    var fname=$("#label"+id+"").clone().html().replace(/<span.*/,''); 
    if($("#label"+id+"> span.req").length > 0) 
    { 
     checked="true"; 
    } 

    $.ajax({ 
     type: "POST", 
     async: false, 
     url: "http://localhost/FormBuilder/index.php/forms/saveField", 
     data: "sequence_no="+id+"&name="+fname+"&type="+ftype+"&size="+fsize+"&instr="+finstr+"&formid="+getformid+"&required="+checked, 
     success: function(msg){ 
       //alert("Data Saved: " + msg); 
     }//success 
    });//ajax 
});//DIV  

Le premier appel Ajax retourne le formulaire ID et avertit même correctement dans la div, mais ne se reflète pas la valeur retournée dans getformid dans le second appel ajax. S'il vous plaît dites-moi ce qui ne va pas.

Modifier: Résolu l'erreur. La cause n'est pas dans mes appels Ajax du tout dans mon contrôleur Cakephp où je renvoie seulement mon ID de formulaire et pas l'instance de formulaire. J'ai changé et j'ai eu la réponse. Merci à tous ceux qui ont aidé.

Répondre

2

EDIT: Je viens juste de réaliser que vous faites des requêtes jax synchrones (not-A)?

Je dis cela parce que vous utilisez

async: false, 

à la fois votre demande Ajax

Cela signifie que le navigateur de vos utilisateurs gèlera aussi longtemps que chaque demande est faite; vous devriez vraiment réfléchir à deux fois à ce sujet: si votre serveur est pas vraiment vraiment rapide, vos utilisateurs pensent « ce site est de la merde, il est Freezin mon navigateur »

Voir http://docs.jquery.com/Ajax/jQuery.ajax#options:

Par défaut, toutes les demandes sont envoyées asynchrone (c'est-à-dire que la valeur est par défaut). Si vous avez besoin de requêtes synchrones , définissez cette option sur false. Notez que les demandes synchrones peuvent verrouiller temporairement le navigateur, en désactivant toutes les actions pendant que la demande est active.


Cela vaut que si, en requêtes asynchrones:
Et, donc, est sans doute pas le problème en ce moment; mais cela deviendra pertinent si vous changez votre requête en asynchrone, donc je ne la supprime pas.

Ajax signifie, avant toute autre chose, A synchrone: la demande Ajax se fait en arrière-plan, tandis que le reste de la page/script poursuit son exécution.

Cela signifie:

  • vous commencez la première requête Ajax
  • il est fait en arrière-plan
  • tout cela se fait en arrière-plan (comme l'exécution d'un couple de lignes de code JS est beaucoup plus rapide que faire une demande au serveur), le code JS continue son exécution
    • La première requête Ajax n'est probablement pas terminée lorsque vous démarrez la seconde.

Ce qui est probablement se passe, est votre cas, est que getformid est réglé que lorsque la première requête Ajax est terminée - ce qui est après le second a déjà commencé.

Si vous souhaitez que la deuxième requête Ajax soit démarrée uniquement lorsque la première est terminée, la deuxième requête Ajax doit être lancée par la fonction connectée à l'événement "success" du premier (au lieu d'affecter "msg "à" getformid "): juste le mettre" après dans la source "ne suffira pas.

+0

Pourriez-vous me donner un échantillon – useranon

+0

Quelque chose comme mettre le code de la deuxième requête à l'intérieur de la fonction hookée sur l'événement "success" du premier ferait, je pense - mais cela n'est vrai que si vous travaillez avec Demande asynchrone (vous devriez!); voir mon édition, à propos de ce point (j'ai seulement vu après avoir répondu que vous utilisiez des requêtes synchrones, désolé) –

+0

je veux faire une requête asynchrone seulement, car je ne suis pas au courant de Ajax je l'ai essayé avec l'async: false..S'il vous plaît comment appeler le deuxième ajax sur le succès du premier appel Ajax – useranon

Questions connexes