Javascript 为什么赢了';t我的长轮询$.ajax请求获取一个新的JSON提要(刷新页面时)

Javascript 为什么赢了';t我的长轮询$.ajax请求获取一个新的JSON提要(刷新页面时),javascript,jquery,ajax,json,Javascript,Jquery,Ajax,Json,我使用ajax设置了长轮询,以监视不断增加的JSON提要。唯一的问题是,虽然我的代码确实被调用,而且似乎有人在请求(我正在监视控制台,以查看控制台日志,但我也在Chrome开发工具的网络面板上看到我确实在请求成功。但是我的计数器,globalLength(基本上只是JSON提要的长度)在我第一次打开页面后不会更新 有一两次我注意到,如果直接转到JSON提要页面,进行长轮询的页面将获得新的图像URL 另外,刷新页面进行长轮询通常会得到新的JSON提要项。这很奇怪。我附加了我的代码,以前唯一没有使用

我使用ajax设置了长轮询,以监视不断增加的JSON提要。唯一的问题是,虽然我的代码确实被调用,而且似乎有人在请求(我正在监视控制台,以查看控制台日志,但我也在Chrome开发工具的网络面板上看到我确实在请求成功。但是我的计数器,
globalLength
(基本上只是JSON提要的长度)在我第一次打开页面后不会更新

有一两次我注意到,如果直接转到JSON提要页面,进行长轮询的页面将获得新的图像URL

另外,刷新页面进行长轮询通常会得到新的JSON提要项。这很奇怪。我附加了我的代码,以前唯一没有使用过的部分是
$。deferred
元素

谢谢

var streamUrl = 'json feed url';
var idCheck = [];
var def = $.Deferred();
var globalLength = 0;


//Long polling that waits for create array function to finish before getting called again
$(function(){
    (function poll(){
        var def = $.Deferred();
        console.log('about to get');
        setTimeout(function(){
            console.log('getting');
            $.ajax({
                url: streamUrl,
                dataType: 'json',
                success: function(data) {
                     createArray(data, def);
                },
                complete: function () {
                    $.when(def).done(function () {
                        console.log('all loaded');
                        poll();
                    });
                }
            });
        }, 7000);
    })();
});


function createArray(data, defer) {
    console.log('creating array');
    var entries = data.entries;
    var urlArray = [];
    for (var k = 0, j = entries.length; k < j; k++) {
        var id = entries[k]['id'];
        if (idCheck.indexOf(id) == -1) {
            idCheck.push(id);
            urlArray.push(id.url)
        }
        if (urlArray.length) {
            preLoadPictures(urlArray, defer.resolve);
        } else {
            defer.resolve();
        }
    }
}

var preLoadPictures = function(pictureArray, callback){
    var loaded = 0;
    for (var i = 0, j = pictureArray.length; i < j; i++){
        var img = new Image();
        img.onload = function(){
            checkLoad();
            console.log('load');
        };
        img.onerror = function(){
            img.src = badURL;
            checkLoad();
            console.log('bad image source error');
        };
        img.src = pictureURLs[i];
    }
    function checkLoad(){
        loaded++;
        if(loaded == pictureURLs.length && callback){
            console.log('The length is ' + globalLength);
            callback();
        }
    }
}
var streamUrl='json提要url';
var idCheck=[];
var def=$.Deferred();
var globalLength=0;
//长轮询,等待create array函数完成后再被调用
$(函数(){
(函数poll(){
var def=$.Deferred();
log(“即将获取”);
setTimeout(函数(){
console.log('get');
$.ajax({
url:streamUrl,
数据类型:“json”,
成功:功能(数据){
createArray(数据,def);
},
完成:函数(){
$.when(def).done(函数(){
console.log(“全部加载”);
poll();
});
}
});
}, 7000);
})();
});
函数createArray(数据,延迟){
log('creating array');
var条目=data.entries;
var urlArray=[];
for(var k=0,j=entries.length;k
真的不清楚哪些不起作用,应该声明一个新的
$。每次延迟
,而不是全局延迟。抱歉,我不清楚@charlietfl-没有下载新图像(我更新了答案)。我还尝试将
$。延迟
设置为本地(请参阅代码)但是没有任何改变。@Startec您是否尝试过查看开发工具的XHR选项卡?请求是否每7秒发出一次?是否返回正确的响应?是的,请求每7秒发出一次,每次都返回一个
200
响应。。。