【问题标题】:How to make form submission synchronous?如何使表单提交同步?
【发布时间】:2013-06-19 09:50:27
【问题描述】:

由于 javascript(包括表单提交)是同步和单线程模型,除了 ajax 调用。是对的吗?但我面临一个关于此的问题。

我在第 1 行提交表单,然后关闭弹出窗口。发生的事情是在提交表单之前调用 self.close 。 所以这里它以异步模式运行。表单提交是一个异步过程吗?如果是的话,我怎样才能在之后制作代码 表单提交同步?(我不想使用 setTimeOut 和 ajax)

这是我的相关jsp代码

function clickSave()
 {

    document.form.action="customerAction.do";
    document.form.submit();// line 1
    self.close();// line 2

 }

更新:- 看起来我需要更正自己的表单提交是按照Is form submit synchronous or async? 的异步过程。所以问题是如何使 self.close 与表单提交同步

【问题讨论】:

    标签: javascript synchronization


    【解决方案1】:

    由于javascript(包括表单提交)是同步且单一的 ajax 调用除外的线程模型。是对的吗?但我面临一个 关于这个的问题。

    嗯,JS 对于每个事件监听器都是异步的。 Ajax 允许异步模式,将结果作为事件返回。

    JS 大多不是并发的:一次只执行一个函数。但是,在最新版本中,有一些方法可以在 JS 中创建后台“并发”线程 (1)

    JS 在单线程上运行。 (后台线程除外)

    我在第 1 行提交表单,然后关闭弹出窗口。什么 发生在表单提交之前调用 self.close。

    这是不可能的。

    表单提交是一个异步过程吗?

    提交是异步的,即JS会继续运行并结束。

    你可以测试这个例子(2)。

    如果是,我怎样才能使表单提交同步后的代码?(我 不想使用 setTimeOut 和 ajax)

    提交将重新加载整个页面,因此您的 JS 将结束,之后,窗口将从服务器加载新页面以及表单结果。您可以在这个新页面中包含一个新的 JS 来“继续”。

    如果您不想重新加载所有页面,则必须使用 AJAX,在这种情况下,您有两种选择:

    • 异步:您可以设置一个事件监听器来接收和使用结果。
    • 同步:您的页面将一直阻塞,直到结果准备好。

    注意: (1):https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers?redirectlocale=en-US&redirectslug=DOM%2FUsing_web_workers

    (2):

    <html>
        <body>
            <script type="text/javascript">
            function click2()
            {
                document.getElementById('form1').submit();
                for(var i=0; i < 1000000000; i++);
                window.open('http://www.stackoverflow.com');
            }
            </script>
    
            <button onclick="click2();"> click </button>
            <br/><br/>
            <form id="form1" action="http://www.duckduckgo.com" method="get">
                <input type="text" value="hello"/>
            </form>
        </body>
    </html>
    

    【讨论】:

    • 我想我可以再做一件事,使用 self.close 创建脚本标签并返回同一页面。它会关闭窗口,这就是我的想法
    • “我在第 1 行提交表单,然后关闭弹出窗口。发生的是 self.close 在表单提交之前被调用。“我的意思是调用不会转到服务器,因为表单提交是异步的,self.close 甚至在调用到服务器之前执行。 “所以这是可能的:)”
    • 否:响应是异步的,调用总是同步的,会一直发送到服务器。当然,如果服务器返回 404 或任何其他错误,您的 JS 将无法处理。
    • 这并不是对 JavaScript 或并发性的正确定义。 JavaScript 已经并发运行了很长时间,否则,网页将是创建 UI 的糟糕选择。并发意味着动作可以异步运行,因此它们不会阻止其他事情的发生,但它们都在单个 UI 线程上运行。您所描述的是带有网络工作者的多线程,AJAX 调用或异步/等待操作不需要这些。
    • @MikeYoung:对我来说,异步并不意味着并发:您将事件推送到队列,然后从事件循环中执行它们。永远不会有两个事件或执行单元并行或乱序运行(严格通过多个 CPU 内核/线程,或通过 OS 调度)。没有工人,您将永远不会面临内存/执行障碍的需要(对于互斥体、信号量、条件变量等)。
    猜你喜欢
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2013-03-03
    • 2012-04-13
    • 2021-08-26
    相关资源
    最近更新 更多