【问题标题】:jQuery ajax call race condition?jQuery ajax 调用竞争条件?
【发布时间】:2015-02-27 15:08:20
【问题描述】:

我有以下javascript函数:

function deploy() {
    $.ajax({
        url: '/Theme/Deploy',
        type: 'POST'
    });
    location.reload();
}

单击按钮时调用此函数。我想启动服务器调用,然后立即刷新页面。当我使用上面的代码时,它永远不会调用服务器,它只会刷新页面。当我删除location.reload() 调用时,它会成功调用。

在 ajax 调用之前是否存在竞争条件或发生了什么事情,即使它在代码中低于它,它也会重新加载页面?

【问题讨论】:

  • 你想做什么?无限请求???
  • 忘记使用 Ajax。重写它,以便/Theme/Deploy 重定向回您要查看的页面。通过常规表单提交向其提交数据。
  • @Vishwanath: deploy() 在按钮点击而不是页面加载时被调用。
  • @Quentin:这意味着我的异步代码将在服务器上。

标签: javascript jquery


【解决方案1】:

请求是异步的。这意味着reload() 在请求完成之前被调用。

要达到您的要求,您应该将 location.reload() 放在 AJAX 调用的 success 处理程序中,以便它在请求完成后运行:

function deploy() {
    $.ajax({
        url: '/Theme/Deploy',
        type: 'POST',
        success: function() {
            location.reload();
        }
    });
}

【讨论】:

  • 我不想等到请求完成。因此使用了短语immediately 和kick off。
  • 恐怕你做不到。正如您所发现的,如果请求太慢,那么由于在 AJAX 完成之前从 reload() 调用的新请求,它将被取消
  • 您不能简单地提出请求吗?我不在乎当前浏览器的请求是否被取消。一旦它到达服务器,它将开始运行服务器代码。这不是异步调用的重点吗?您无需等待响应。
  • 请求完成后,您仍需要在同一页面上。因此我使用了短语you can't do that ;)
  • @im1dermike 当您手动执行此操作时,您看到的是 AJAX 请求完成,然后您可以按 F5 刷新页面。当您调用location.reload() 时,所有网络请求(包括 AJAX)都将停止,并从头开始加载页面。这就是为什么 Rory 说你不能那样做,因为浏览器不是那样工作的。您不能有在页面加载之间持续存在的 AJAX 请求。
【解决方案2】:

尝试将服务器作为脚本标记调用。我不确定这是否可以肯定,但在我的测试中,它似乎可以发出并行请求。

function deploy(){
    var head = document.getElementsByTagName('head')[0];
    var sc = document.createElement('script');
    sc.setAttribute('src', '/Theme/Deploy');
    head.appendChild(sc);
    location.reload();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多