我想在屏幕上显示警报()之前清除输入type=“email”(通过单击按钮)。我只是使用一个在20ms内解决的promise来实现这一点。但是为什么如果我删除第11行(promise行),它就停止工作了呢?正在执行的命令不是同步的,因此它们应该按顺序执行?(如果我在胡说八道,请纠正我,我还在学习async js)
第11行:https://codepen.io/layige5800/pen/zYmEaQe
await new Promise(resolve => setTimeout(resolve, 20)); // only with this line I can make the input be emptied before the alert appears
1条答案
按热度按时间s3fp2yjn1#
window.alert
暂停主线程。这意味着当警报打开时,不会运行其他代码。因此,当你告诉浏览器清除输入时,它不会立即出现(重新绘制)(见下文),在此期间,警报打开,这会导致浏览器停止执行其他所有操作。通过添加setTimeout
(您不需要Promise
),您基本上是在创建警报之前给浏览器时间来完成DOM更新/绘制(清除电子邮件)。现在,你可能会问这在JS中是如何实现的,通常是一个单线程程序。Here is a blog post,它准确地解释了您的情况(请参阅“使用
alert()
使DOM更新看起来异步”一节)。