You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript问题:在含try/catch的函数中无法修改元素类名与文本内容

JavaScript问题:在含try/catch的函数中无法修改元素类名与文本内容

嘿,我一眼就看出问题出在哪了——异步操作的时序问题!你的sendEmail函数里调用的Email.send是个异步方法(它返回Promise),但你现在的写法是直接同步返回r,这时候Promise还没完成,r根本还没被赋值成"success"或者"failure",所以后面修改元素类名和文本的代码用的还是初始的s="undefined",自然看不到变化啦。

另外还有个小坑:你在catch里写了var r = "failure",这里的r是catch块的局部变量,和外面的var r不是同一个,就算真的抛出错误,外面的r还是undefined,根本不会被修改。

给你两个可行的修改方案,选哪个都行:

方案一:用Promise链式调用直接处理

把修改元素的逻辑放到Promise的then和catch里,这样只有当邮件发送完成(成功或失败)后才会更新页面内容:

<!DOCTYPE html>
<html>
    <head>
        <link rel="icon" type="image/x-icon" href="favicon_sent.ico">
        <link rel="stylesheet" type="text/css" href="styles.css">
        <script src="https://smtpjs.com/v3/smtp.js"></script>
        <title>Email Sent!</title>
    </head>
    <body>
        <p id="status" class="thinking">Processing...</p>
        <script type="text/javascript">
            const st = document.getElementById("status");
            const responses = {
                "undefined": "Processing...",
                "success": "Success!",
                "failure": "Uh-Oh! Something went wrong."
            }
            const classes = {
                "undefined": "thinking",
                "success": "success",
                "failure": "failure"
            }

            function sendEmail() {
                return Email.send({
                    Host: "smtp.gmail.com",
                    Username: "sender@email_address.com",
                    Password: "Enter your password",
                    To: 'receiver@email_address.com',
                    From: "sender@email_address.com",
                    Subject: "Sending Email using javascript",
                    Body: "Well that was easy!!"
                });
            }

            // 发送邮件并处理结果
            sendEmail()
                .then(() => {
                    st.setAttribute('class', classes["success"]);
                    st.innerHTML = responses["success"];
                })
                .catch(() => {
                    st.setAttribute('class', classes["failure"]);
                    st.innerHTML = responses["failure"];
                });
        </script>
    </body>
</html>

方案二:用async/await让代码更像同步写法

如果你觉得Promise链式调用看着麻烦,可以用async/await语法,让异步代码读起来更直观:

<!DOCTYPE html>
<html>
    <head>
        <link rel="icon" type="image/x-icon" href="favicon_sent.ico">
        <link rel="stylesheet" type="text/css" href="styles.css">
        <script src="https://smtpjs.com/v3/smtp.js"></script>
        <title>Email Sent!</title>
    </head>
    <body>
        <p id="status" class="thinking">Processing...</p>
        <script type="text/javascript">
            const st = document.getElementById("status");
            const responses = {
                "undefined": "Processing...",
                "success": "Success!",
                "failure": "Uh-Oh! Something went wrong."
            }
            const classes = {
                "undefined": "thinking",
                "success": "success",
                "failure": "failure"
            }

            // 把sendEmail改成async函数
            async function sendEmail() {
                try {
                    await Email.send({
                        Host: "smtp.gmail.com",
                        Username: "sender@email_address.com",
                        Password: "Enter your password",
                        To: 'receiver@email_address.com',
                        From: "sender@email_address.com",
                        Subject: "Sending Email using javascript",
                        Body: "Well that was easy!!"
                    });
                    return "success";
                } catch (err) {
                    return "failure";
                }
            }

            // 用立即执行的async函数包裹调用逻辑
            (async function() {
                const s = await sendEmail();
                st.setAttribute('class', classes[s]);
                st.innerHTML = responses[s];
            })();
        </script>
    </body>
</html>

最后提醒一句:千万不要在前端代码里直接写邮箱密码!这会导致你的账号信息泄露,非常不安全。如果是正式项目,邮件发送逻辑应该放在后端处理哦。

备注:内容来源于stack exchange,提问作者SubnauticaFan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 20:05:29