2009-07-16 146 views
2

這裏是我的短代碼片段:因爲evalJson不這樣做處理JSON數據,但(21KB gzip壓縮)Javascript DoEvents相當於?

$(document).ready(function() { 
$.get("/Handlers/SearchData.ashx", 
function(data) { 
json = $.evalJSON(data); 
}); 

//do some other stuff 

//use json data 

alert(json == null); 

}); 

警告說真的。我需要以某種方式等待它在使用該數據之前完成 - 正是我在while循環中使用DoEvents做的事情。

回答

3

沒有相當於調用DoEvents,但你可以把那要看你的JSON數據的代碼放到一個函數,從AJAX回調中調用它。您還可以使用$ .getJSON方法,因此您不必自行評估JSON。

$(document).ready(function() { 
    $.getJSON("/Handlers/SearchData.ashx", 
    function(data) { 
     json = data; 
     stuffToDoAfterIHaveData(); 
    }); 

    //do some other stuff 
}); 

//use json data 
function stuffToDoAfterIHaveData() { 
    alert(json == null); 
} 

或者,jQuery提供了一種使AJAX請求同步的方法(即它們停止代碼執行直到響應返回)。您可以使用$.ajaxSetup({ async: false });,或者您可以直接調用$.ajax方法並在選項對象中傳遞async:false

3

而是自己執行evalJSON的,爲什麼不能讓jQuery的弄清楚當它這樣做:

$.ajax({ 
    url:"/Handlers/SearchData.ashx", 
    type: "get", 
    dataType: "json", 
    success:function(d) { 
    //d now contains a JSON object, not a string. 
    alert(d==null); 
    } 
}); 
+0

這並沒有解決他的關於推遲執行代碼,直到XHR返回後的問題。 – Prestaul 2009-07-16 14:46:06

+3

當然可以。成功函數僅在請求和JSON解析成功後才調用,因此解決了他的兩個問題。 – Salty 2009-07-16 17:41:55

2

類似於javascript中的doEvents的唯一情況是setTimeout()。 第一個參數應該是一個字符串,在完成「系統事件」後要執行的代碼,第二個參數是要等待的毫秒數... 這很複雜,但這是我所知道的唯一解決方案。

2

你可以使用這樣的:

$(document).ready(function(){ 
    json = $.parseJSON(
     $.ajax({url: '/Handlers/SearchData.ashx', async: false}).responseText 
    ) 

    alert(json == null); 
})