Jquery AJAX data.length到var不起作用

Jquery AJAX data.length到var不起作用,jquery,ajax,Jquery,Ajax,当我这样做时: $.ajax({ url: purl, dataType: 'json', success: function(data){ alert(data.length); } }); 我收到一个长度计数的警报 但是当我这么做的时候 $.ajax({ url: purl, dataType: 'json', success: function(data){ items = data.length;

当我这样做时:

$.ajax({
    url: purl,
    dataType: 'json',
    success: function(data){
        alert(data.length);
    }
});
我收到一个长度计数的警报

但是当我这么做的时候

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

alert(items);

将length设置为global varialbe,它不想玩得很好。思想?

AJAX部分不会立即发生;
警报发生在AJAX回调有时间为
项设置新值之前

从jQuery1.5开始,
$.ajax
返回一个实现Promissions接口的对象。因此,您可以随时调用
.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).on("click", function () {
    promise.done(function(data){
        alert("Data is " + data);
    });
});
请注意,我们将警报放在一个匿名函数中,并将其传递给
promise.done
,只有在解决了promise之后才能执行

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

既然承诺已经解决,任何进一步的点击(在5秒钟的等待之后)都将导致立即采取行动


演示:

存储对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);
    });
});

任何时候需要数据时,都可以向
项目添加一个已完成的回调,并在该回调中使用数据。

因此,目标是只设置
项目
,以便在其他地方使用。有没有办法告诉
alert
或者我想用什么方法来等待AJAX回调?@Plummer是的,您可以从
success
函数中调用过程中的下一个函数,或者您可以使用一个承诺,并在承诺得到解决时给它一些代码来执行。@Plummer有一天,我们都会的;)在那之前,我们彼此都有。你必须使用回调函数的原因不是因为jQuery故意让你的代码难看,而是因为I/O是异步发生的,只有在调用回调时才能保证结果存在。我可以设置对全局变量的AJAX调用,然后用一个词引用所有这些废话?是的。:)但是请注意,它不会在每次使用数据时重新请求数据,您只是在数据准备就绪时请求访问现有数据。但是,如果我将其设置为父函数中的变量,则每次运行该函数时,它是否会运行请求?也就是说,它不是全局变量,而是函数内部的变量。如果它在函数内部,并且您从函数返回$.ajax(),则是。您只需执行函数().done(处理程序)