Javascript Ajax轮询似乎只在最后一次请求时才停止

Javascript Ajax轮询似乎只在最后一次请求时才停止,javascript,jquery,ajax,settimeout,polling,Javascript,Jquery,Ajax,Settimeout,Polling,我使用Ajax轮询来轮询服务器的进度百分比。如果您想知道,我没有使用setInterval,因为这会导致多个请求彼此饥饿。我在jQuery.ajax()的“complete”回调中使用setTimeout,并将下一个请求的时间设置为5000毫秒 因此ajax调用的间隔大约为5-7秒(取决于前一个ajax调用的响应时间,从0%到100%缓慢进行) 问题是,虽然所有的ajax调用看起来都很好并且几乎按时完成,但只有最后一个ajax调用延迟了。而且它从服务器获得响应时没有延迟。最后一个ajax调用本身

我使用Ajax轮询来轮询服务器的进度百分比。如果您想知道,我没有使用setInterval,因为这会导致多个请求彼此饥饿。我在jQuery.ajax()的“complete”回调中使用setTimeout,并将下一个请求的时间设置为5000毫秒

因此ajax调用的间隔大约为5-7秒(取决于前一个ajax调用的响应时间,从0%到100%缓慢进行)

问题是,虽然所有的ajax调用看起来都很好并且几乎按时完成,但只有最后一个ajax调用延迟了。而且它从服务器获得响应时没有延迟。最后一个ajax调用本身是在大约2分钟的长时间延迟后完成的

我已经搜索并阅读了所有类似的问题/答案,我的场景似乎很独特,只有最后一个检查状态请求延迟,而所有其他请求都正常工作。

此ajax调用的服务器日志在几乎所有测试中都为我提供了以下模式(这是一个示例):

  • Ajax请求1:在0秒时发出-返回0%的进度
  • Ajax请求2:在7秒时发出-返回17%的进度
  • Ajax请求3:在13秒时发出-返回30%的进度
  • Ajax请求4:在20秒时发出-返回54%的进度
  • Ajax请求5:在157秒时发出-返回100%的进度
如果您需要,我的代码如下:

var makeNextAjaxCall = true;
function ajaxCaller(url, data) {
    $.post({
        url: url,
        data: data,
        success: function(data){
            if(data.progress === 100) {
                makeNextAjaxCall = false;
            }
        },
        complete: function() {
            if(makeNextAjaxCall) {
                setTimeout(function() {
                    ajaxCaller(url, data);
                }, 5000);
            }
        }
    });
}

我花了好几天的时间试图找出上一个ajax调用延迟的原因,甚至不是由服务器延迟的,而是由客户端延迟的。

您是否尝试过将超时更改为20000ms或1000ms以查看发生了什么?我猜第三个请求需要大量时间,服务器才能响应延迟了最后一个调用的请求返回100%@J.Nicastro没有好的建议会尝试once@AlonEitan正如我在问题上所说的,最后一个请求本身是在间隔2分钟而不是5秒后由ajax发出的,因此它似乎不是由服务器造成的延迟。此外,即使总共发出了4-5个请求,甚至10-20个请求被拒绝,这种情况也会发生e总共发出。@AlonEitan这正是我现在要做的。.会发布结果吗?你是否尝试过将超时更改为20000ms或1000ms以查看发生了什么?我猜第三个请求需要大量时间服务器响应,这会延迟返回100%的最后一个呼叫@J.Nicastro没有好的建议会尝试once@AlonEit正如我在我的问题上所说的,最后一个请求本身是由ajax在间隔2分钟后发出的,而不是5秒,因此它似乎不是由服务器引起的延迟。此外,即使在总共发出4-5个请求的情况下,甚至在总共发出10-20个请求的情况下,也会发生这种情况。@AlonEitan这正是我试图做的事情。@AlonEitan我将公布结果