延迟设置超时()



我遇到了一些使用 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行包括辅助方法 - 我认为在这里发布它是不可行的。 抱歉 - 如果没有代码没有人可以提供帮助,那么也许我会咬紧牙关,尝试以某种有意义的格式将其复制到此处。

========

==

编辑2:这是方法尝试执行的操作的一般工作流程。 该函数是一个"同步"函数,它既向服务器发送数据,又从服务器检索数据。

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

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

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

因此,我在上面插入第二个代码块的位置位于每个方法的"i."部分,换句话说,ajax应该(重复)回调。 我意识到我在上面的评论中是错误的;实际上从来没有嵌套的 AJAX 调用,而是数据库事务中的 Ajax 调用中的数据库事务。

到目前为止,

你做得很好。 您要使用的技巧是将事件链接在一起,如下所示:

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

最新更新