延迟setTimeout()

时间:2012-08-09 17:59:12

标签: javascript ajax html5

我遇到了一些使用ajax从数据库中获取值的异步JavaScript代码的问题。

基本上,我想要做的是在填充列表后刷新页面。为此,我尝试将以下代码插入到填充列表的函数中:

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

正如您可能想象的那样,当列表填充不到1秒时,这种方法可以正常工作,但在需要更长时间时会导致问题。所以我想把这个代码插入到每个ajax调用成功调用的函数中:

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

因此理论上,每次获取列表元素时,计时器都应该重置,这意味着只有在成功检索到最终列表元素后1秒才能调用刷新函数。但是,在执行过程中,所有发生的事情都是timer1重置一次,这是第一次到达第二个代码块。

有人能看出问题所在吗?或者,如果有更好的方法吗?谢谢。

==========

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

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

==========

EDIT2:这是方法尝试做的一般工作流程。该函数是一个“同步”函数,它既可以向服务器发送数据,也可以从服务器中检索数据。

  • 予。调用函数从本地数据库中检索项目
  • 我。每次提取项目时,都会将其发送到服务器(ajax)
  • 一个。当ajax回调时,该项目在本地更新以反映 它的成功/失败

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

  • 我。每次提取项目时,都会从服务器(ajax)获取与该项目ID相匹配的项目
  • 一个。从服务器成功获取后,将比较项目
  • 湾如果服务器端项目更新,则更新本地项目

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

1 个答案:

答案 0 :(得分: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()是“响应处理”代码中的最后一个语句,否则这种竞争条件将始终是一个潜在的问题。