實際開發過程中,需要通過ajax獲得后台數據,如果數據不滿足業務要求,則中止執行后面代碼。有時ajax回調函數明明執行了return語句,但系統仍然執行后面代碼,這是什么原因呢?
為了探究問題原因,下面將幾種常見寫法逐一進行測試驗證。
寫法1
function test1() {
var msg="test1";
$.ajax({
type:"POST",
async:false,
timeout:5000,
dataType:"json",
url:"?act=ok",
success: function(d){
return "ajax成功";
},
error:function(e){
return "ajax異常";
}
});
return msg;
}
執行方法test1(),返回值為【test1】
寫法2
function test2() {
var msg="test2";
$.ajax({
type:"POST",
async:false,
timeout:5000,
dataType:"json",
url:"?act=ok",
success: function(d){
msg="ajax成功";
return msg+'2';
},
error:function(e){
msg="ajax異常";
return msg+'2';
}
});
return msg;
}
執行方法test2(),返回值為【ajax異常】
寫法3
function test3() {
var msg="test3";
$.ajax({
type:"POST",
async:false,
timeout:5000,
dataType:"json",
url:"?act=ok",
success: function(d){
msg="ajax成功";
},
error:function(e){
msg="ajax異常";
}
});
return msg;
}
執行方法test3(),返回值為【ajax異常】
寫法4
function test4() {
var msg="test4";
$.ajax({
type:"POST",
async:false,
timeout:5000,
dataType:"json",
url:"?act=ok",
success: function(d){
msg="ajax成功";
return "ajax成功2";
},
error:function(e){
msg="ajax異常";
return "ajax異常2";
}
});
return msg;
}
執行方法test4(),返回值為【ajax異常】
寫法5
function test5() {
var msg="test5";
var msg2="test5-2";
$.ajax({
type:"POST",
async:false,
timeout:5000,
dataType:"json",
url:"?act=ok",
success: function(d){
msg="ajax成功";
return "ajax成功2";
},
error:function(e){
msg="ajax異常";
return "ajax異常2";
}
});
return msg2;
}
執行方法test5(),返回值為【test5-2】
寫法6
function test6() {
var msg="test6";
$.ajax({
type:"POST",
async:false,
timeout:5000,
dataType:"json",
url:"?act=ok",
success: function(d){
msg="ajax成功";
return "ajax成功2";
},
error:function(e){
msg="ajax異常";
return "ajax異常2";
}
});
return "test6-2";
}
執行方法test6(),返回值為【test6-2】
結論
外層函數如果要獲得 ajax 回調函數返回值,須滿足以下條件
- ajax設置為同步方式
- 回調函數返回值必須賦值給外層函數變量,不能在回調函數內部通過字面量return