【问题标题】:ajax synchronous call with timeoutajax同步调用超时
【发布时间】:2011-01-12 19:23:49
【问题描述】:

ajax 新手,所以问一个非常基本的问题。

-- 有没有办法在设置超时的情况下进行同步 ajax 调用(async:false)?

http://www.ajaxtoolbox.com/request/

虽然在我的应用程序中,超时非常适合异步调用, 但是对于一个特定的场景,我需要一个同步调用(javascript实际上应该等到它从服务器收到回复),这也可以正常工作。但是我需要处理服务器可能需要很长时间并且可能会调用 ajax 超时的情况。

还有其他我可以参考的 ajax 标准文档吗?

谢谢

【问题讨论】:

  • 任何时候你可能想要一个同步请求,你应该使用一个异步请求,然后在回调中发生什么。
  • 我怀疑它会被实现,因为同步 XHR 已被正式弃用,即使它是某些情况下唯一可用的解决方案,例如在 document_start 上执行页面脚本之前将大动态数据传递给扩展中的内容脚本.

标签: ajax asynchronous timeout synchronous


【解决方案1】:

基本上,在同步 ajax 请求期间,浏览器被阻止,并且在浏览器被阻止时无法执行任何 javascript。正因为如此,jQuery 无法在设置的超时后中止 ajax 请求,因为 jQuery 是 javascript,并且在浏览器被阻止时无法执行 javascript。这是同步 ajax 的主要缺陷。

任何时候你可能想要一个同步请求,你应该使用一个异步请求,然后在回调中发生什么,如下所示;

$.ajax({
    url : 'webservices.php',
    timeout: 200,
    dataType : 'json',
    data : {
        'cmd' : 'ping',
    },
    success : function(data, textStatus) {
        $.ajax({
            url : 'webservices.php',
            async: false,
            dataType : 'json',
            data : {
                'cmd' : 'feedback',
                'data' : data,
                'userinfo' : window.dsuser
            },
            success : function(data, textStatus) {
                // success!
                Status("Thanks for the feedback, "
                    + window.dsuser.user + "!");
            }
        });
    },
    error : function(jqhdr, textStatus,
                     errorThrown) {
        Status("There was trouble sending your feedback. Please try again later");
    }
});

【讨论】:

    【解决方案2】:

    我认为不可能在同步调用上设置超时。当您设置“async:false”时,我相信浏览器实际上在等待响应时会锁定。仅在绝对需要时才应使用同步请求(因为浏览器已锁定)。

    【讨论】:

    • 谢谢!!这就是我在任何地方都能找到的,另外 - 是否有任何标准的 api / 文档可供我们查看 ajax...?
    • 您可以查看 XmlHttpRequest 的文档,但最好使用抽象出大量细节的库。例如,jQuery 有一个非常好的 AJAX 框架。这是我比较熟悉的那个。 jQUery 的 AJAX 文档:api.jquery.com/category/ajax
    • true - 我也在为此使用 jquery...并且文档没有明确说明超时(api.jquery.com/jQuery.ajax),如果您熟悉验证框架,我正在尝试它的“远程” :' 调用服务器进行验证的功能...问题是我使用按钮的 onclick 事件(而不是通过 submithandler)验证表单,并且在检查表单错误后,我需要重定向到下一页 - 在这种情况下,它甚至会在远程返回延迟之前重定向(如果服务器延迟)....所以基本上我想等待远程调用完成
    • 啊,验证框架我没试过。在我的脑海中,我会说您应该将重定向代码放入您的“成功”处理程序(或等效处理程序)中。这样,您只会在异步调用完成后重定向。
    • hmm...为了让事情变得更复杂,我也在验证该字段上的 onkeyup 事件...所以在这种情况下,由于调用的是相同的远程验证,因此重定向成功不会是一个好主意。但是您确实回答了我最初的问题……超时不适用于同步调用……这对我有足够的帮助。我可能需要探索我猜的验证框架。谢谢!
    猜你喜欢
    • 2011-01-19
    • 2012-06-30
    • 1970-01-01
    • 2020-10-31
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多