- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当 alert
等模态对话框窗口打开时,我遇到了 JS setTimeout
的意外行为,我想知道其背后的原因。
我预计 setTimeout(fn,10000) 的意思是“定期检查当前时间,当它大于 Now + 10000 毫秒时触发将调用传递的‘fn’函数的事件处理程序”。这是合乎逻辑的,看看我们如何将超时度量作为“从现在开始的毫秒数”传递。但是,显然,setTimeout
上的倒计时是字面上的倒计时,将在模式窗口打开时暂停。
setTimeout(function(){
//alert A
alert("10 seconds have passed for the first setTimeout")
}, 10000);
setTimeout(function(){
//alert B
alert("Wait for 15 seconds and press OK");
},1000);
我希望在您关闭警报 B 后立即显示警报 A(假设您等待 15 秒),因为警报 A 超时仅 10 秒并且它们已经过去了。然而,实践表明,当警报 B 打开时,警报 A 的倒计时只是暂停,并且它只会在大约 3 分钟后显示。在您关闭警报 B 后又过了 9 秒,无论 B 打开了多长时间。
这似乎不符合逻辑。
更新。 我绝对不是唯一在这里感到困惑的人,因为这种暂停超时的行为发生在 Chrome 和 Internet Explorer 中,而不是 Firefox。 Firefox 执行了我预期的行为——如果你在警报 B 上等待 15 秒——警报 A 会在你关闭它时立即弹出。
最佳答案
对于为什么 IE 和 Chrome 在 alert
被解除之前暂停未决计时器,而 Firefox 没有,我怀疑是否有明确的答案。我相信这只是因为在解释 W3C's specs for alert
时有一定的自由度。 :
The alert(message) method, when invoked, must run the following steps:
If the event loop's termination nesting level is non-zero, optionally abort these steps.
Release the storage mutex.
Show the given message to the user.
Optionally, pause while waiting for for the user to acknowledge the message.
进一步解释第 4 步(暂停)here :
Some of the algorithms in this specification, for historical reasons, require the user agent to pause while running a task until a condition goal is met. This means running the following steps:
If any asynchronously-running algorithms are awaiting a stable state, then run their synchronous section and then resume running their asynchronous algorithm. (See the event loop processing model definition above for details.)
If necessary, update the rendering or user interface of any Document or browsing context to reflect the current state.
Wait until the condition goal is met. While a user agent has a paused task, the corresponding event loop must not run further tasks, and any script in the currently running task must block. User agents should remain responsive to user input while paused, however, albeit in a reduced capacity since the event loop will not be doing anything.
因此,事件循环在任何情况下都会暂停。当警报仍然可见和模式时,不会调用较长超时的回调。如果不是这样,可能会出现各种麻烦事,例如多个警报叠加在一起。
现在,您能从上面的规范中看出计时器倒计时应该在警报的生命周期内暂停,还是应该在警报消失后立即触发?我不能,我什至不确定哪种行为更合乎逻辑。
我敢肯定的是,除调试目的外,您不应该将 JavaScript 警报用于任何其他用途。警报确实允许暂停脚本执行(而某些异步操作如 XHR 正在后台进行),但它们对用户非常不友好。正确的方法是拥抱异步代码,使用 promises 和可能的 ES6 generators/yeild
(如果您追求线性代码风格)。
以下问题高度相关,那里讨论了 alert
的一些替代方法:
关于javascript - 为什么 JS 模态消息框在 setTimeout() 上暂停倒计时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26487403/
我在 Window 2008 x64 上的 IIS 7 下托管了一个网站。 IIS 以 64 位模式运行,该站点有自己的 64 位应用程序池等。该网站大部分时间似乎运行良好,然后每小时突然卡住用户请求
我有一个 imageView 并希望它像这样工作: ImageViewer可见 5秒暂停 ImageView 不可见 5秒暂停 ImageViewer可见 等等... 我该怎么做?我试过 sleep
我在我的 JavaScript 函数中使用了下面的代码。我想在 10 秒后调用这个函数。然而该函数立即被触发!?!不确定发生了什么。 function testing() { //oth
我想暂停计时器,点击按钮后我想继续计时器计数...我搜索但找不到与此相关的功能.. 怎么办? 最佳答案 您将需要一个变量来跟踪自 Chronometer 启动以来耗时: long timeWhenSt
我目前有一个程序可以从麦克风收集声音信号并在 python 上实时显示波形。对于 matplotlib funcanimation,我正在尝试通过这种方式向我的程序添加一些暂停和启动按钮或功能。但它没
我有一个由套接字提供的热Observable。我可以使用pausable暂停套接字供稿。但是一旦“取消暂停”可观察对象,就需要显示套接字在暂停订阅时可能发送的最后一个值。我不想跟踪套接字手动发送的最后
我知道这是可能的,但我还没有找到方法,所以我在问。 在播放 3rd 方音乐(例如 Spotify)时开始在我的应用程序中播放 mp3 声音时。 Spotify 暂停,您必须恢复 Spotify,让它再
我正在尝试使用 iPhone 的前置摄像头录制有声视频。因为我还需要支持暂停/恢复功能,所以我需要使用 AVAssetWriter .我在网上找到了一个用 Objective-C 编写的示例,它几乎实
我知道互斥锁可以作为一种实现,但是我想知道是否有一种方法可以像视频播放一样暂停/恢复另一个线程。当其他正在运行的线程很复杂时,此方法更易于编程。 最佳答案 SIGTSTP是用于暂停进程的信号,如果您有
到目前为止,我已经看到了以下停止动画的技术,但我在这里寻找的是旋转 View 停止在当前的角度,而不是返回到 0。 struct DemoView: View { @State private
我一般在问有关多线程的问题。例如我锁定了一个互斥锁并恢复任务,然后我想挂起它,我的问题是,我应该在挂起之前解锁互斥锁吗?这样当我再次使用互斥锁恢复它时,它会成功恢复吗? 我刚刚开始使用多线程的东西,我
我有2个缩略图链接,单击它们时,它们会以灯箱样式打开视频。我的目标是让它们在打开时播放,在关闭时暂停(单击背景区域时关闭)。 我的HTML代码在这里: M
到目前为止,我没有将我发现的几种不同方法拼凑在一起: http://192.185.121.49/~steveobr/ 我需要所有的语音演示像第一个“商业”一样工作 正如您在实时示例中看到的那样,每个
所以我正在制作某种游戏,玩家可以在其中获得一些能力。玩家回合结束后,服务器应有 5 秒的超时时间,其中不执行任何代码,然后在该时间后结束回合。但是,如果客户端单击其中一项电源,服务器应停止 5 秒超时
我尝试将自己的方法添加到 Tween 类中以暂停/恢复所有补间。这就是我所拥有的: createjs.Tween.pauseAllTweens = function() { for ( var
我对 Azure 搜索标准级别的成本有疑问。是否可以将 Azure 搜索级别从标准更改为基本?是否可以暂时暂停 Azure 搜索标准?我在门户中没有看到此控件。我是否需要将 Azure 搜索实现重新创
如何用相同的代码制作play/Pause按钮。 - (IBAction)min:(id)sender { NSString *path = [[NSBundle mainBundle] pathF
我知道这很可能超出了沙箱范围,但我还是想问一下: 我想在我的应用程序中放置一个“暂停/播放”按钮,以暂停或播放任何背景音频。基本上,我希望实现在多任务栏中找到的播放/暂停按钮。 一个简单的例子是有人用
我正在制作一款编程游戏,玩家可以在其中对盟友的行为进行编程。玩家为给定的盟友编写decide()函数的主体,可以用任何java代码填写,但必须返回一个 Action 。我想为每个盟友提供一组有限的每个
我有功能 1 用于播放音乐,第二个用于设置实际音乐的暂停,我的暂停功能不起作用。我该如何设置暂停? function play(id){ var audio = new Audio('
我是一名优秀的程序员,十分优秀!