0

我正在使用以下 JS 代码来调用 Web 处理程序。这段代码完美地调用了处理程序,只是在 IE 中而不是 FF 中。

$.ajax({ type: "GET",
            url: "../MasterPages/AHMHandler.ashx?T=1",
            dataType: "HTML",
            success: function (msg) {
                document.getElementsByName('cartId')[0].value = msg;
                }
            ,
            error: function (e) {
                return false;
            }
        });
        Sleep(2000);

我的代码有什么问题?

4

1 回答 1

1

看到Sleep()您的代码中的调用以及您对 的评论alert()后,我想说您的问题在于对 Ajax 代码的工作原理缺乏了解。

当您进行 Ajax 调用时,它被异步调用。这意味着进行了调用,然后当前函数的其余部分继续运行,而不会停止等待 ajax 代码运行。

ajaxsuccess函数最终会被调用,但只有在 http 请求完成时才会调用。同时,您当前的功能将继续运行

这里的要点是,如果在进行 ajax 调用之后运行的同一函数中有代码,则不能依赖给定的事件序列。

放在Sleep()那里可能会使它看起来工作,因为某些浏览器可能会将睡眠时间视为运行 ajax 成功功能的机会,因此您的代码似乎以正确的顺序运行。放在alert()那里将更有可能使其工作,因为alert()通常需要更多时间才能将其清除,因此 ajax 函数有更多机会运行。

但是你不应该依赖它们中的任何一个来获得正确的执行顺序。

您应该做的是将要在 ajax 调用之后运行的代码放入success函数中。这是确保它在 ajax 调用完成后运行的唯一方法。

希望有帮助。

[编辑] OP评论后的进一步澄清:

Spudley,睡眠功能是我自己的功能,可以防止浏览器在 2 秒内被重定向。函数睡眠(毫秒){ var start = new Date().getTime(); for (var i = 0; i < 1e7; i++) { if ((new Date().getTime() - start) > 毫秒) { break; } } }

只是为了参考,像这样的睡眠功能在 Javascript 中是一个非常糟糕的想法。你应该使用 setTimeout() 来处理这种事情。

但是,要点仍然相同——您有在 之后运行的代码,$.ajax()它将阻止您的 ajax 成功函数的执行。如果您之后立即进行重定向,那么成功函数可能永远没有机会运行。

Analert()确实会使其工作,因为该success函数会在清除警报时找到一个插槽来运行, beforeSleep被调用,但你不应该依赖它。

答案保持不变:您应该将要在 ajax 调用之后运行的代码放在success函数中。

这是您所做更改的代码:

$.ajax({ type: "GET",
        url: "../MasterPages/AHMHandler.ashx?T=1",
        dataType: "HTML",
        success: function (msg) {
            document.getElementsByName('cartId')[0].value = msg;
            setTimeout(function() { //this instead of your Sleep function
                 //this is where you need to do your redirect, or whatever else you're doing after the ajax completes.
            }, 2000);
        }
        ,
        error: function (e) {
            return false;
        }
});
//don't put **any** code here after the ajax call! put it in the success function.
于 2013-08-07T11:17:53.313 回答