当我这样做时:
$.ajax({
url: purl,
dataType: 'json',
success: function(data){
alert(data.length);
}
});
我得到一个长度计数警报。
但是当我这样做时......
$.ajax({
url: purl,
dataType: 'json',
success: function(data){
items = data.length;
}
});
alert(items);
将长度设置为全局变量,它不想玩得很好。想法?
答案 0 :(得分:4)
AJAX部分不会立即发生; {AJ}回调有时间为alert
设置新值之前发生items
。
从jQuery 1.5开始,$.ajax
返回一个实现Promises接口的对象。因此,您可以在执行代码之前随时确认承诺已解决时调用.done
方法:
var promise = $.ajax({/*...*/});
promise.done(function(data){
// Only works if the promise is resolved
});
例如,假设我们直接创建了一个延迟对象:
var promise = $.Deferred();
然后我们告诉它要等到五秒钟后再解决:
setTimeout(function(){
promise.resolve("Foo");
}, 5000);
但是我们绑定了一个处理程序来响应document
对象的点击:
$(document).on("click", function () {
promise.done(function(data){
alert("Data is " + data);
});
});
请注意,我们将警报置于匿名函数中,并在承诺解决后将其传递给promise.done
以仅执行。
这将构建一个队列,直到该promise被解决。如果我在前五秒内单击四次,则不会发生任何事情,但一旦该承诺结算,我将看到一个接一个出现四个警告框。
现在承诺得到解决,任何进一步的点击(等待5秒后)都会立即采取行动。
答案 1 :(得分:3)
存储对jqXHR的引用(它也像promise对象一样),然后您可以使用它来获取数据。
var items = $.ajax({
url: purl,
dataType: 'json'
});
items.done(function(data){
alert(data.length);
});
// ... somewhere else, such as in a click event
$("#someEl").click(function(){
items.done(function(data){
alert(data.length);
});
});
只要您需要数据,请向items
添加完成回调并使用该回调中的数据。