3

当我这样做时:

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

我收到长度计数的警报。

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

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

alert(items);

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

4

2 回答 2

4

AJAX 部分不会立即发生;发生alert在 AJAX 回调有时间为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 解决后将其传递promise.done给执行。

这会建立一个队列,直到该承诺得到解决。如果我在前五秒钟内点击四次,什么都不会发生,但是一旦该承诺解决,我将看到四个警报框一个接一个地出现。

现在承诺已经解决,任何进一步的点击(等待 5 秒后)都会立即采取行动。

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

于 2012-12-19T19:28:49.280 回答
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并在该回调中使用数据。

于 2012-12-19T19:33:10.587 回答