2013-09-30 159 views
0

我有一個AJAX函數,該函數從javascript函數調用。 類似這樣的:JQUERY AJAX WITH CALLBACK

(CODE1) 
//javascript function calling AJAX. 
var function check(){ 
    var status = chkHoliday(date,'Date Chosen'); 
    alert('called'); 
    return status; 
} 

//AJAX function 
function chkHoliday(date,str){ 
    var flag = true; 
    $.ajax({ 
     type: "GET", 
     url: someurl, 
     async: false,   //if commented, the alert() from the caller function is called before completion of this function. 
     dataType: "json", 
     success: { 
      flag = false; 
     } 
    }); 
    return flag; 
} 

它運作良好。唯一的問題是,因爲異步它被設置爲false,網頁排序暫停一段時間,但然後繼續進行下去。

爲了避免這種情況我讀一些有關回調函數,所以我嘗試了這一點: (代碼2)

//javascript function calling AJAX. 
var function check(){ 
    var status; 
    chkHoliday(date,'Date Chosen',function(retVal){ 
     status = retVal; 
    }); 
    if(status != null){ 
     alert(status); 
     return status; 
    } 
    else{ 
     alert(true); 
     return true; 
    } 
} 

//AJAX function 
function chkHoliday(date,str,callback){ 
    var flag = true; 
    $.ajax({ 
     type: "GET", 
     url: someurl, 
     //async: false,   //if commented, the alert() from the caller function is called before completion of this function. 
     dataType: "json", 
     success: { 
      flag = false; 
      callback(flag); 
     } 
    }); 
    //return flag; 
} 

這個工作,但警報再次調用AJAX函數之前能夠完成,指出「不確定」。我不知道我做錯了什麼。

我想要的是,AJAX函數應該等到它完全執行,然後返回到調用函數並在調用函數中運行下一個語句並停止進程(即使用異步)。我也希望AJAX返回的值應該可以方便地訪問我的調用者函數。

+1

長答案:[如何從AJAX調用返回響應?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call),簡短的回答:將警報也放在回調中。 – JJJ

+0

嘗試使用Jquery的blockUI插件。 http://www.malsup.com/jquery/block/ – nasaa

+0

其實我想將狀態的值返回給調用函數。爲了簡化我在這種情況下使用的警報! –

回答

0

把警報的回調函數內:

chkHoliday(date,'Date Chosen',function(retVal){ 
     status = retVal; 
     if(status != null){ 
      alert(status); 
     } 
    else{ 
     alert(true); 
    } 
}); 

但要注意,你不能再使用return語句如你所預期的,因爲它是異步的。

0

由於AJAX的工作是異步的,因此將它放在函數中並返回一個值是個問題。爲了解決這個使用推遲的承諾。這將向調用者承諾ajax結果。它略有不同。這是一個例子。對我來說就像一個魅力。 當然,您需要根據自己的需求進行調整,但您真正需要做的就是創建數據對象。從你的PHP文件

var data = {} 

function chkHoliday(data) { 
    var deferred = $.ajax({ 
     method: "post", 
     url: ajaxURL, 
     dataType: "json", 
     data: data 
    }); 
    return deferred.promise(); 
} 

chkHoliday(data).done(function (response) { 
    console.log(response); 
} 

回用

echo json_encode(array("success"=>"hello")); 
0

把警報回調內部 功能。否則警報將同時工作,儘管成功或錯誤。