AJAX data.length到var无法正常工作

时间:2012-12-19 19:27:37

标签: jquery ajax

当我这样做时:

$.ajax({
    url: purl,
    dataType: 'json',
    success: function(data){
        alert(data.length);
    }
});

我得到一个长度计数警报。

但是当我这样做时......

$.ajax({
    url: purl,
    dataType: 'json',
    success: function(data){
        items = data.length;
    }
});

alert(items);

将长度设置为全局变量,它不想玩得很好。想法?

2 个答案:

答案 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秒后)都会立即采取行动。

演示:http://jsfiddle.net/w7swE/1/

答案 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添加完成回调并使用该回调中的数据。