Javascript 页面在更改位置之前等待AJAX

Javascript 页面在更改位置之前等待AJAX,javascript,ajax,load,Javascript,Ajax,Load,这个问题可能看起来有点奇怪,这个问题是在页面通过webtests时出现的 页面使用AJAX调用(async设置为true)收集一些数据。由于某些原因,它不会在Ajax调用返回之前交换页面——请考虑下面的代码: console.log("firing ajax call"); $.ajax({ type: "POST", url: "requestedService", data: mode : "requestedMetho

这个问题可能看起来有点奇怪,这个问题是在页面通过webtests时出现的

页面使用AJAX调用(async设置为true)收集一些数据。由于某些原因,它不会在Ajax调用返回之前交换页面——请考虑下面的代码:

console.log("firing ajax call");
$.ajax({
        type:    "POST",
        url:      "requestedService",
        data:     mode : "requestedMethod",
        cache:    false,
        dataType: "json",
        success:  function() { console.log("ajax response received") },
        error:    null,
        complete: null,
    });
console.log("changing window location");
window.location = "http://www.google.com"
只有在AJAX返回响应后,位置才会更改。我已经测试了这个调用,它实际上是异步的,页面没有被阻塞。即使AJAX调用尚未完成,但没有完成,它也应该加载新页面。我可以看到页面正在尝试加载,但只有在得到响应后才会发生。有什么想法吗

控制台输出为:

firing ajax call
changing window location
ajax response received

这对我来说似乎很管用。在异步处理程序中的代码执行之前,位置已更改。也许你应该发布一些真实的代码,而不是一个简化的版本,这样我们可以更好地帮助你

下面是一个如您所料的演示:

下面是结果的屏幕截图:


我已经点击了两次按钮,您可以在JS控制台中看到,关于位置更改的消息在每次结果之前打印出来。(错误与CORS有关,如果它是同一个域,它将导航)。

有点晚,但可能其他人也会有同样的问题。 @todd menier的回答可能会有所帮助:


因此,问题可能是服务器端。例如,如果您在默认情况下使用PHP会话,那么当服务器处理ajax请求时,用户的会话将被锁定,因此在ajax完成并释放锁之前,服务器将无法处理新页面的下一个请求。如果ajax处理代码不需要锁,您可以提前释放锁,以便下一个页面加载可以同时进行。

奇怪的是,您为什么希望发生这种情况?正如我所说,这不是一个真正需要的用例,但它是在执行webtests时发生的(他们加载页面,检查内容,然后或多或少地立即导航到下一页)。它们失败是因为在AJAX返回之前被阻止导航到下一页。您是否尝试将
async
设置为false?是的,正如预期的那样,它只是在调用返回之前阻止页面,没有其他行为差异。我编辑了问题。我还使用了记录器,并根据输出,页面应在调用之前加载响应返回。但是,页面只是等待ajax响应返回,然后才实际更改位置…因此,如果您的代码语句以正确的顺序执行,浏览器是否可能只是花了一段时间重定向而导致延迟?您显示的控制台输出似乎正是您想要的,对吗?是的,输出表明它正在做它应该做的事情。但是我可以看到页面正在等待ajax调用返回-如果ajax调用需要更长的时间,重定向也需要更长的时间。我认为这只是一个感知问题。如果代码运行正常,就没有其他方法可以控制它。由浏览器来处理异步请求st和位置改变。
$(document).ready(function() {

    var result;

    $("#btn").on('click', function(sender, args) {
        setInterval(function() {
            result = "some result";
            console.log("Just returned a result");
        }, 5000);
        window.location = "http://www.google.com";
     });

});