未调用 JavaScript 异步主体

问题描述 投票:0回答:1

我在按下按钮时发出异步请求:

在 html 正文加载时,init 函数为表单的提交事件提供处理程序。该处理程序实际上执行异步请求。

这里有两种解决方案。第一个,可以称为“直接的”,效果很好。第二个(“间接的”)则不然。 不同之处在于提交处理程序受到影响的方式。我希望这两种解决方案是等效的,但对于第二个解决方案,永远不会调用 async 内的代码。为什么?

第一

<!DOCTYPE html>
<html>
<meta meta name="viewport" content="width=device-width, user-scalable=no" />

<head>
    <title>Radio</title>
    <link rel="stylesheet" type="text/css" href="style.css">
    <script type="text/javascript">
    
        function set_fields() {
        }

        function onload() {  
            myForm.onsubmit = async (e) => {    // Direct call
                e.preventDefault();

                const form = document.getElementById('myForm');

                const formData = new FormData(form);
                const jsonObject = Object.fromEntries(formData);
                const jsonString = JSON.stringify(jsonObject);

                console.log(jsonString);

                let response = await fetch('/set', {
                    method: 'POST',
                    body: jsonString
                });
            };
        }  

    </script>
</head>

<body onload="onload()">
    <form id="myForm">
        <p>
            <input type="number" name="txtFrequency"
                class="source" />
        </p>
        <p>
     <button type="submit" name="set" class="volume">OK</button>

        </p>
    </form>
</body>
</html>

第二个

<!DOCTYPE html>
<html>
<meta meta name="viewport" content="width=device-width, user-scalable=no" />

<head>
    <title>Radio</title>
    <link rel="stylesheet" type="text/css" href="style.css">
    <script type="text/javascript">
    
        function set_fields() {
            async (e) => {
                e.preventDefault();

                const form = document.getElementById('myForm');

                const formData = new FormData(form);
                const jsonObject = Object.fromEntries(formData);
                const jsonString = JSON.stringify(jsonObject);

                console.log(jsonString);

                let response = await fetch('/set', {
                    method: 'POST',
                    body: jsonString
                });
            };
        }

        function onload() {
            myForm.onsubmit = set_fields;   // call via a function pointer
        }

    </script>
</head>

<body onload="onload()">
    <form id="myForm">
        <p>
            <input type="number" name="txtFrequency"
                class="source" />
        </p>
        <p>
     <button type="submit" name="set" class="volume">OK</button>

        </p>
    </form>
</body>
</html>
javascript asynchronous
1个回答
0
投票

在第一个示例中:

myForm.onsubmit = async (e) => { 

您将函数分配给表单的

onsubmit
属性。

提交表单时,会触发提交事件,这将导致运行该事件侦听器。


在第二个例子中:

myForm.onsubmit = set_fields;

您可以以相同的方式分配

set_fields
函数。

提交表单时运行

set_fields
函数。问题是它什么也没做

async (e) => {

它创建了另一个函数,但不对其执行任何操作。它不会将其分配到任何地方。它不叫它。它甚至不记录它。它对这个函数什么也没做

© www.soinside.com 2019 - 2024. All rights reserved.