3

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

该页面使用 AJAX 调用(异步设置为 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
4

2 回答 2

2

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

这是一个按您预期工作的演示:http: //jsfiddle.net/BSg9P/

$(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";
     });

});

这是结果的截图: http: //screencast.com/t/VbxMCxxyIbB

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

于 2013-10-31T13:27:44.107 回答
0

有点晚了,但也许其他人也会有同样的问题。@todd-menier 的这个答案可能会有所帮助: https ://stackoverflow.com/questions/941889#answer-970843

所以问题可能是服务器端的。例如,如果您默认使用 PHP 会话,则在服务器处理 ajax 请求时用户的会话将被锁定,因此在 ajax 处理之前,服务器将无法处理对新页面的下一个请求完成并释放锁。如果您的 ajax 处理代码不需要它,您可以提前释放锁,这样下一个页面加载可以同时发生。

于 2019-01-31T16:53:46.790 回答