我有几个函数在jQuery/ajax执行,但我有随机失败。
第一个函数总是被执行(在ajax中)。它调用PHP代码,将数据添加到数据库中,然后第二个函数使用返回的一些数据。
但是第二个根本不执行!success或fail甚至在ajax 方法之前没有响应。
如果我在这两个函数之间放一个alert('something');
,第二个函数就会执行,如果我不这样做,它就不会执行。以前有人遇到过这个问题吗?
$("#send_new_arch_form").click(function(){
if($("#archNewLocSet").val()=="0"){
var name = $("#nomArch").val();
var fname = $("#prenomArch").val();
var v1 = $("#rueArch").val();
var v2 = $("#numArch").val();
var v3 = $("#bteArch").val();
var v4 = $("#locArch").val();
var v5 = $("#telArch").val();
var v6 = $("#emailArch").val();
if((name == "")){
$(".errorNewArchMsg").html(" * All fields Required").fadeIn("Slow").fadeOut(3000);
}else if(v5!='' && ((v5.length)<9)){
$(".errorNewArchMsg").html(" Le numéro de téléphone est invalide").fadeIn("Slow").fadeOut(3000);
}else if(v6!='' && ((validateEmail(v6))==false)){
$(".errorNewArchMsg").html(" L'adresse e-mail est invalide").fadeIn("Slow").fadeOut(3000);
}else{
$(".errorNewArchMsg").fadeOut();
$.ajax({
type :'POST',
url :'./php/insertNewArch.php',
data :{ 'name' : name,'fname' : fname,'rue' : v1,'numero' : v2, 'bte' : v3, 'loc' : v4,'tel' : v5,'email' : v6},
error:function(response){
alert("<h3>Erreur lors de la cr351ation...</h3>");
},
success:function(returnData){
alert("RETOUR : "+returnData);
$("#nomArch").val('');
$("#prenomArch").val('');
$("#rueArch").val('');
$("#numArch").val('');
$("#bteArch").val('');
$("#locArch").removeAttr('selected').filter("[value='']").attr('selected',true);
$("#telArch").val('');
$("#emailArch").val('');
$.fancybox.close();
$("#archListe").empty();
$.ajax({
type : 'POST',
url : './php/getArchListe.php',
data : {
'query':'*',
},
error : function(){
alert('ERREUR MISE A JOUR DE LA LISTE');
},
success : function(response){
$('#archListe').append($('<option>',{
value : '',
text : 'Choisissez dans la liste'
}));
var myData = JSON.parse(response);
for(var i=0;i<myData.length;i++){
var id = myData[i].id;
var nom = myData[i].nom;
var prenom = myData[i].prenom;
var rue = myData[i].rue;
var numero = myData[i].num;
var boite = myData[i].bte;
var cp = myData[i].cp;
var loc = myData[i].loc;
if(rue!="" && numero!=""){
rue = rue+", "+numero;
}
if(cp!="" && loc!=""){
loc = "- "+cp+" "+loc;
}
var field = nom+" "+prenom+" ; "+rue+" "+boite+" "+loc;
$('#archListe').append($('<option>',{
value : id,
text : field
}));
}
}
});
}
});
}
}else{
var name = $("#nomArch").val();
var fname = $("#prenomArch").val();
var v1 = $("#rueArch").val();
var v2 = $("#numArch").val();
var v3 = $("#bteArch").val();
var v4 = $("#paysLocArch").val();
var v5 = $("#CPNewLocArch").val();
var v6 = $("#nameNewLocArch").val();
var v7 = $("#telArch").val();
var v8 = $("#emailArch").val();
if((name == "")){
$(".errorNewArchMsg").html(" * Le nom est obligatoire!").fadeIn("Slow").fadeOut(3000);
}else if(v7!='' && ((v7.length)<9)){
$(".errorNewArchMsg").html(" Le numéro de téléphone est invalide").fadeIn("Slow").fadeOut(3000);
}else if(v8!='' && ((validateEmail(v8))==false)){
$(".errorNewArchMsg").html(" L'adresse e-mail est invalide").fadeIn("Slow").fadeOut(3000);
}else if(($.trim(v5)!='') && ($.trim(v6)=='')){
$(".errorNewArchMsg").html(" Impossible de créer une localité sans lui donner de nom").fadeIn("Slow").fadeOut(3000);
}else if(($.trim(v6)!='') && ($.trim(v5)=='')){
$(".errorNewArchMsg").html(" Impossible de créer une localité sans donner le code postal").fadeIn("Slow").fadeOut(3000);
}else if((($.trim(v5)!='')||($.trim(v6)!=''))&&(v4=='')){
$(".errorNewArchMsg").html(" Impossible de créer une localité sans choisir le pays").fadeIn("Slow").fadeOut(3000);
}else{
$(".errorNewArchMsg").fadeOut();
$("#nomArch").val('');
$("#prenomArch").val('');
$("#rueArch").val('');
$("#numArch").val('');
$("#bteArch").val('');
$("#paysLocArch").removeAttr('selected').filter("[value='']").attr('selected',true);
$("#CPNewLocArch").val('');
$("#nameNewLocArch").val('');
$("#telArch").val('');
$("#emailArch").val('');
$.fancybox.close();
var insertNewLoc = true;
newLoc = false;
if(($.trim(v5)=='')||($.trim(v6)=='')||($.trim(v4)=='')){
insertNewLoc = false;
}
if(insertNewLoc == true){
//alert("INSERT NEW LOC!!");
newLoc = $.ajax({
type : 'POST',
url : './php/insertNewLoc.php',
data : {'pays':v4,'cp':v5,'localite':v6},
error : function(response){
alert("<h3>Erreur lors de la cr351ation de la nouvelle localit351</h3>");
},
success : function(returnData){
newLoc = returnData;
return newLoc;
}
});
}else{
newLoc = v6;
}
//IF I ADD ALERT('SOMETHING') HERE, THE .AJAX STATEMENT BELOW GETS EXECUTED, IF I DON'T ADD ANY ALERT, THE STATEMENT DOES NOT GET EXECUTED...
$.ajax({
type :'POST',
url :'./php/insertNewArch.php',
data :{'name' : name,'fname' : fname,'rue' : v1,'numero' : v2, 'bte' : v3, 'loc' : newLoc,'tel' : v7,'email' : v8,'pays':v4},
beforeSend:function(){
alert(newLoc);
},
error:function(response){
alert("<h3>Erreur lors de la cr351ation...</h3>");
},
success:function(returnData){
$.ajax({
type : 'POST',
url : './php/getArchListe.php',
data : {'query':'*'},
error : function(){
alert('ERREUR MISE A JOUR DE LA LISTE');
},
success : function(response){
$("#archListe").empty();
$('#archListe').append($('<option>',{
value : '',
text : 'Choisissez dans la liste'
}));
var myData = JSON.parse(response);
for(var i=0;i<myData.length;i++){
var id = myData[i].id;
var nom = myData[i].nom;
var prenom = myData[i].prenom;
var rue = myData[i].rue;
var numero = myData[i].num;
var boite = myData[i].bte;
var cp = myData[i].cp;
var loc = myData[i].loc;
if(rue!="" && numero!=""){
rue = rue+", "+numero;
}
if(cp!="" && loc!=""){
loc = "- "+cp+" "+loc;
}
var field = nom+" "+prenom+" ; "+rue+" "+boite+" "+loc;
$('#archListe').append($('<option>',{
value : id,
text : field
}));
}
}
});
}
});
}
}
});
尝试设置async:false
为ajax
请求。我相信这将解决这个问题,因为你说,通过放置一个alert
,它被执行,因为alert
将停止流的其余部分,并给请求完成的时间,让第二个得到执行。
我还建议您尝试使用延迟的jquery
对象来处理响应的成功和失败情况。http://api.jquery.com/category/deferred-object/.This的方式,你有更干净的代码,你不会结束链接的callbacks
一个在另一个。首先做async:false
,因为我很确定这将解决您的问题。