Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 延迟设置超时()_Javascript_Ajax_Html - Fatal编程技术网

Javascript 延迟设置超时()

Javascript 延迟设置超时(),javascript,ajax,html,Javascript,Ajax,Html,我对一些使用ajax从数据库获取值的异步JavaScript代码有问题 本质上,我想做的是在填充列表后刷新页面。为此,我尝试将以下代码插入到填充列表的函数中: var timer1; timer1 = setTimeout([refresh function], 1000); 正如您可能想象的那样,当列表填充时间少于1秒时,这可以正常工作,但当它需要更长的时间时,会导致问题。因此,我想到在每次ajax调用成功时将此代码插入到调用的函数中: clearTimeout(timer1); timer

我对一些使用ajax从数据库获取值的异步JavaScript代码有问题

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

var timer1;
timer1 = setTimeout([refresh function], 1000);
正如您可能想象的那样,当列表填充时间少于1秒时,这可以正常工作,但当它需要更长的时间时,会导致问题。因此,我想到在每次ajax调用成功时将此代码插入到调用的函数中:

clearTimeout(timer1);
timer1 = setTimeout([refresh function], 1000);
因此,从理论上讲,每次提取列表元素时,计时器都应该重置,这意味着只有在成功检索最终列表元素后1秒才调用刷新函数。然而,在执行过程中,所有发生的事情就是定时器1被重置一次,即第一次到达第二个代码块时

有人能看出问题出在哪里吗?或者有没有更好的方法?谢谢

==========

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

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

==========

EDIT2:下面是这些方法尝试执行的一般工作流程。该功能是一种“同步”功能,既可以向服务器发送数据,也可以从服务器检索数据

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

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

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

因此,我在上面插入的第二个代码块位于每个方法的“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()是“响应处理”代码中的最后一条语句,否则这种竞争条件将始终是一个潜在的问题。

到目前为止,您做得很好。您想要使用的技巧是将您的事件链接在一起,如下所示:

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

AJAX使用什么?甚至内置的AJAX方法也为您提供了在AJAX完成时执行回调的方法。请把你剩下的代码展示给我,代码即将发布。所以回顾一下我的代码,我认为没有一个可行的方法把它发布在这里,至少足够让它有意义。希望我的澄清能有所帮助——如果没有,我将尝试以其他方式描述它,或者如果没有人可以帮助的话,我将尝试发布代码