2011-03-06 111 views
0

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

有没有办法,我可以发送下一个数据节点,只有当前一个完成处理? 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); 
} 

问候
尼基尔古普塔

+0

“(!(I> = 0)){IF” - > ???? omg :)无论如何,不​​明白你想要完成什么。你想链接函数调用?那么,为什么你使用setTimeout?当第一个结束时,请致电下一个。 – 2011-03-06 10:21:47

+0

当'我'有其他值(我使用'我'很多,因此..)是一个错误的事情? :| – Stoic 2011-03-06 10:27:13

回答

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(); 
+0

你能否扩展这个例子来说明如何将数据注入到上面的函数中,也就是说我有一个json格式的数组数组,我怎么才能让'requestAjaxData'只发送一个子数组?我真的很感激这一点。我不知道这个特殊的事情,因此,我正在使用Timer来增加列表索引('i')。 – Stoic 2011-03-06 10:34:49

+0

解决了:)谢谢:) – Stoic 2011-03-06 11:10:52