greasemonkey脚本运行没有超时?

时间:2014-04-28 03:43:49

标签: javascript greasemonkey

我创建了一个非常简单的Greasemonkey脚本,该脚本应该向控制台发送两条消息,第一条消息发送到第一条,第二条消息在暂停后发送。出于某种原因,他们都没有停下来就马上走了......我做错了什么?

谢谢!

console.log('first message');
setTimeout(function(){console.log('second message');},300000);
console.log('third message');
setTimeout(function(){console.log('fourth message');},300000);
document.getElementById('button').click();

1 个答案:

答案 0 :(得分:2)

我猜你的代码的意图是这样做:

* display a message (#1)
* wait 5 minutes and display a message (#2)
* display a message (#3)
* wait 5 minutes and display a message (#4)
* click a button and navigate away.

但是,setTimeout()函数是异步的:它不会暂停执行脚本的其余部分,直到它完成,而是启动一个单独的执行线程,它将在指定的延迟后执行操作,而主程序线程继续进行。 1

您编写的函数实际上将采取以下步骤:

* display a message (#1).
* start a timer.
* display a message (#3).
* start a timer.
* Navigate to a new page.

所有这些步骤都是非常快速地发生的。

一旦计时器到期,它将导致打印一条消息。不幸的是,导航到新页面会杀死当前的执行上下文,这会在计时器触发之前中止。如果你没有那个"导航"步骤,代码将运行如下:

* display a message (#1).
* start a timer.
* display a message (#3).
* start a timer.
* (5 minutes pass.)
* first timer expires, displaying a message (#2)
* second timer expires, displaying a message (#4).

(顺便说一句,顺便说一下,你的两个计时器都在同时耗尽;总计只需要5分钟,第一部分不是5分钟,第二部分则是5分钟。)

如果您希望按钮单击仅在显示所有其他消息后发生,您也应该单击定时器调用上的按钮:

setTimeout(function() {document.getElementById('button').click();}, 300000);

1:这是一个过于简单化,以明确更清楚的事情。有关JavaScript计时器的更精确说明,请参阅http://ejohn.org/blog/how-javascript-timers-work/