转换javascript计时器函数以使用异步调用

时间:2011-03-06 10:06:54

标签: javascript asynchronous

我有这个javascript函数,它使用一个计时器每2秒调用一次ajax文件 但是,我看到在完成先前数据的执行之前,此数据被发送到ajax文件。也就是说,它在大约10秒内发送整个列表,而数据需要大约120秒才能处理。

有没有办法,我可以发送下一个数据节点,只有当前一个数据节点已经完成处理? 当这个计时器结束时,cb.call(this)被用来调用一个函数 而querylimit是一个响应变量,如果它是真的,则退出该函数。

var i = 0;
var querylimit=false;
function refreshTimer(list,cb,i){
    if (!(i >= 0)) { i= 0; }
    setTimeout((function(chunk){
        i++;
        return function(){
            if (querylimit) { cb.call(this); }
            if(i <= list.length && !querylimit){
                refreshTimer(list,cb,i);
                refreshClients(chunk);
            }
            if(i == list.length+1) { cb.call(this); }
            if(i > list.length+1 || querylimit) { return null; }
        }
    }) (list[i]), 2000);
}

问候
尼基尔古普塔

1 个答案:

答案 0 :(得分:2)

我通常设置我所谓的“级联”,这是 window.setTimeout(...)调用的连锁反应,而不是单个 window.setInterval(.. 。)电话。

而不是:

function requestAjaxData() {
    // prep ajax / call onAjaxDataReceived on success.
}
function onAjaxDataReceived() {
    // process data
}
window.setInterval(requestAjaxData, 2000);

我做:

function requestAjaxData() {
    // prep ajax / call onAjaxDataReceived on success.
}
function onAjaxDataReceived() {
    // process data

    // continue the cascade
    requestAjaxDataCascade();
}
function requestAjaxDataCascade() {
    window.setTimeout(requestAjaxData, 2000);
}
requestAjaxDataCascade();