当我这样做: $.ajax({ url: purl, dataType: 'json', success: function(data){ alert(data.length); }}); 我得到一个长度计数警报. 但是当我这样做的时候…… $.ajax({ url: purl, dataType: 'json', success: function(data)
$.ajax({ url: purl, dataType: 'json', success: function(data){ alert(data.length); } });
我得到一个长度计数警报.
但是当我这样做的时候……
$.ajax({ url: purl, dataType: 'json', success: function(data){ items = data.length; } }); alert(items);
将长度设置为全局变量,它不想玩得很好.思考?
AJAX部分不会立即发生;在AJAX回调有时间设置项目的新值之前发生警报.从jQuery 1.5开始,$.ajax返回一个实现Promises接口的对象.因此,您可以在执行代码之前随时确认promise已解决时调用.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之后执行.
这会构建一个队列,直到该promise被解决.如果我在前五秒内单击四次,则不会发生任何事情,但一旦该承诺结算,我将看到一个接一个出现四个警告框.
现在承诺得到解决,任何进一步的点击(在5秒等待之后)将立即采取行动.
演示:http://jsfiddle.net/w7swE/1/