2012-08-09 105 views
1

我遇到了一些使用ajax从数据库中提取值的异步JavaScript代码的问题。推迟setTimeout()

本质上,我想要做的是刷新页面,一旦列表已填充。为此,我尝试插入下面的代码到填充列表功能:

var timer1; 
timer1 = setTimeout([refresh function], 1000); 

正如你可能想象,当名单人口占不到1秒能正常工作,但会造成一些问题,当它需要更长的时间。于是,我只好将这段代码为呼吁各Ajax调用成功功能的想法:

clearTimeout(timer1); 
timer1 = setTimeout([refresh function], 1000); 

所以从理论上讲,每一个列表元素提取时间计时器应该重置,这意味着刷新功能应只有在最终列表元素成功检索后才会被调用1秒。然而,在执行过程中,发生的所有情况是,定时器1被重置一次,第一次到达第二块代码。

任何人都可以看到问题可能是什么?或者如果有更好的方法来做到这一点?谢谢。

==========

编辑:要清除我的Ajax调用是如何工作的:与代码的结构的问题之一是, Ajax调用实际上是嵌套的;原始ajax调用的回调方法本身就是另一个ajax调用,其回调方法包含数据库事务 (错误 - 请参见下文)。另外,我有两个这样的方法同时运行。我需要的是一种确保在刷新页面之前所有级别的所有呼叫都已完成的方法。这就是为什么我认为给这两种方法一个计时器,并在每次调用一个回调方法时重置它,都会继续推回执行,直到所有线程都完成为止。

说实话,代码非常复杂 - 大约140行,包括辅助方法 - 我不认为在这里发布它是可行的。对不起 - 如果没有人可以帮助没有代码,那么也许我会咬紧牙关,并尝试在这里以一种具有某种意义的格式复制它。

==========

EDIT2:这里是什么样的方法都尝试做一般的工作流程。该功能是一个“同步”功能,既可以向服务器发送数据,也可以从服务器获取数据。

  • 一函数被调用它从本地数据库
  • 我取回物品。每次获取物品时,将其发送到服务器(ajax)
  • a。当ajax回拨时,该项目在本地更新以反映其成功/失败

  • 二。从本地数据库中检索(单独的)项目列表

  • i。每次获取物品时,从服务器获取与物品ID相匹配的物品(ajax)
  • a。在成功从服务器获取数据时,将比较项目
  • b。如果服务器端项目更新,则更新本地项目

所以我插入上面第二个代码块的位置在'我'中。每个方法的部分,换句话说,ajax应该回调(重复)的地方。我意识到我在上面的评论中出现了错误;实际上从来没有嵌套的ajax调用,而是数据库事务内的ajax调用中的数据库事务。

+5

你对AJAX有什么用?即使是内置的AJAX方法,您也可以在AJAX完成时执行回调。请显示余下的代码 – Cfreak 2012-08-09 18:02:22

+0

够公平,代码即将出现。 – 2012-08-09 18:16:06

+0

因此,回顾一下我的代码,我不认为有一个可行的方法来发布它,至少有足够的理由。希望我的澄清有所帮助 - 如果没有,我会尝试以其他方式描述它,或者只是在没有人能提供帮助的情况下尝试发布代码。 – 2012-08-09 18:27:58

回答

1

到目前为止你的表现相当不错。您要使用的窍门是链中的事件一起,像这样:

function refresh() 
{ 
    invokeMyAjaxCall(param1, param2, param3, onSuccessCallback, onFailureCallback); 
} 

function onSuccessCallback() 
{ 
    // Update my objects here 

    // Once all the objects have been updated, trigger another ajax call 
    setTimeout(refresh, 1000); 
} 

function onFailureCallback() 
{ 
    // Notify the user that something failed 

    // Once you've dealt with the failures, trigger another call in 1 sec 
    setTimeout(refresh, 1000); 
} 

现在,这个难度是:如果呼叫失败,会发生什么?理想情况下,这听起来像你想确保你不断更新来自服务器的信息,即使发生临时故障,你仍想继续前进。

我在这里假设你的AJAX库允许你做失败回调。但是,我看到一些情况下库挂起而没有失败或成功。如有必要,您可能需要使用一组单独的逻辑来确定与服务器的连接是否已中断,并重新启动您的回调序列。

编辑:我怀疑你得到的问题是在第一次调用完成之前排队下一次调用的结果。基本上,你正在设置一个竞争条件:在下一个呼叫被触发之前,第一个通话是否可以结束?它可能工作多数时间,或者它可能会工作一次,或几乎一直工作;但除非setTimeout()是“响应处理”代码中的最后一个语句,否则这种竞争条件将始终是潜在的问题。

+0

感谢您的回答!虽然实际上并不是我实施的解决方案,但您确实将注意力放在了问题上(或者至少是我认为的 - 我将不得不查看代码在将来是否稳定)。基本上我的问题是,当我在将项目提交给服务器的函数中重置计时器时,我并未在ajax调用的实际回调中这样做。通过在那里添加重置,代码似乎工作。布莱,我的大脑受伤了。 – 2012-08-09 19:33:32

+0

是的,我知道这种感觉!我曾经被这很多人抓住。为了好玩,另一种可以尝试的方法是设置一个“忙碌”标志,并且每隔1秒检查一次代码:如果不忙,则会产生新的呼叫。一些AJAX库可以告诉你是否有任何通话正在进行中。 – 2012-08-09 19:38:55