【发布时间】:2014-07-31 21:15:01
【问题描述】:
我正在使用长轮询来检索带有图像 URL 的大型 json 提要。我正在我的$.ajax 请求的success 部分中预加载这些网址,并且希望在这些图像完全加载后调用一个函数来处理这些图像。我试图通过在我的$.ajax 请求的complete 部分中使用$.Deferred 对象并在我的图像预加载循环结束时解析$.Deferred 来做到这一点。
但是,当我监控控制台时,我可以看到在预加载图像时继续进行 $.ajax 调用。 $.Deferred 直到预加载循环结束才解决,所以我不明白为什么会发生这种情况。我对$.Deferred 的了解有限,但我正在努力了解更多信息,因此有关为什么会发生这种情况以及如何解决此问题的任何建议都会很棒。我得到的理解是,它们是一种防止函数在被保留之前被调用的方法......
作为奖励,除了丑陋的代码之外,是否存在发出多个$.ajax 请求并对返回的数据执行相同操作的问题?谢谢
$(function(){
(function poll(){
var streamUrl = 'http://demofeed';
var def = $.Deferred();
console.log('about to get');
setTimeout(function(){
$.ajax({
url: streamUrl,
dataType: 'json',
success: function(data) {
createArray(data, def);
},
complete: function () {
$.when(def).done(function() {
//Long-poll again
poll();
});
},
error: function(){
setTimeout(function(){
console.log('There was an error with the XHR Request');
poll();
}, 3000);
}
});
}, 7000);
})();
});
function createArray(data, defer){
console.log('creating array');
var entries = data['entries'];
for (var k = 0, j = entries.length; k < j; k++) {
console.log('there is new media');
if (entries[k].img) {
var img = new Image();
img.onload = (function(entry) {
return function() {
validArray.push(entry);
console.log('New Media Loaded');
}
})(entries[k]);
img.onerror = function(){
console.log('error: bad image source');
};
img.src = entries[k].url;
} else {
console.log('Not an image');
}
}
defer.resolve(); //Here is where I resolve the deferred object, once for loop is done (all images have been loaded)
}
【问题讨论】:
-
您的问题有什么更新吗?
-
是的。您的回答修复了它,并感谢您推荐 jQuery 的替代品。我想如果没有任何库也不会太难做到这一点......同意吗?
标签: javascript jquery ajax promise jquery-deferred