2009-07-16 154 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); 
})