告诉JavaScript停止执行代码并在函数中间执行后台操作

告诉JavaScript停止执行代码并在函数中间执行后台操作,javascript,concurrency,greasemonkey,Javascript,Concurrency,Greasemonkey,关于标题,我很抱歉,但我想不出任何真正能提供信息和简洁的东西 我的情况是,我正在启动一个StimeTimeUT,我希望它能够在JS函数的中间运行(它用来解决将GM函数注入到网页中的问题)。 在这三个测试中,rValue仍然没有定义(这是有意义的,因为JS在大多数情况下是单线程的) 所以我想到了两个解决方案 喜爱的: 无论如何,有没有告诉JS在一个函数的中间睡觉和工作在后台的东西(比如超时)? 其他: 有人知道何时会调用此超时吗?也许在这个函数执行之后,但在调用它之前,它会再次启动吗? 在这种情况

关于标题,我很抱歉,但我想不出任何真正能提供信息和简洁的东西

我的情况是,我正在启动一个StimeTimeUT,我希望它能够在JS函数的中间运行(它用来解决将GM函数注入到网页中的问题)。 在这三个测试中,rValue仍然没有定义(这是有意义的,因为JS在大多数情况下是单线程的)

所以我想到了两个解决方案

喜爱的: 无论如何,有没有告诉JS在一个函数的中间睡觉和工作在后台的东西(比如超时)?

其他: 有人知道何时会调用此超时吗?也许在这个函数执行之后,但在调用它之前,它会再次启动吗? 在这种情况下,将右值设置为全局将解决这个问题(但会使编码稍微混乱)

还是要等到所有的JS都执行完毕?
在这种情况下,我可能需要另一个setTimeout来处理结果。

无法满足您的要求。在HTML5成为一个广泛传播的标准之前,如果不进行异步思考,你就无法做到你所要求的

例如:

unsafeWindow.testG = function(key, dValue, callback){
   var rValue;
   setTimeout(function(){
      rValue = GM_getValue(key, dValue);
      callback(rValue);
   }, 0);
}
并通过回调调用此函数:

unsafewindow.testG(key, dValue, function(rValue) {
   alert(rValue);
});
alert("foo");

对于最后一个sippet,
“foo”
将在
rValue
之前回响,因为
testG
仅在Javascript线程可用时,或者只有在没有其他脚本运行时才会执行超时功能。

回答第一个问题,JS中没有“sleep”功能。事实上,有一个网站致力于创建一个:结论:你不能

如果希望稍后运行其余代码,可以将该代码放入函数并设置timeout()

当然,处理您设置的场景的通常方法是回调。因为您基本上是在等待setTimeout中的事情发生,所以可以让它在完成后调用代码的其余部分。例如:

var fartResult
function waitAMinuteThenFart (callback) {
  function fart () {
    fartResult = 'fart'
    callback(fartResult)
  }
  setTimeout(fart, 1000*60)
}
waitAMinuteThenFart(function (result) { alert(result) })

我真的不明白你的其他解决方案/问题是什么。如果您解释一下您的函数试图做什么也会有所帮助-对,它看起来就像
GM\u getValue()
的一个无操作包装器。如果你的代码在后台工作时处于休眠状态,那么你的后台工作就成了唯一要做的工作,不再是真正的后台工作了,是吗?需要澄清您在这里试图实现的目标。我能做的唯一的建议是考虑使用回调函数。关于其他扩展解释:JS什么时候决定将执行移交到TimeTimeOutt是安全的?假设我有类似于
testG()的东西/*setTimeout运行了吗?*/for(var count=0;count<200000;count++){}/*现在如何*/
,它是页面上唯一的JS(除了testG的声明)。JS是否仅在最后一个JS运行后才移交执行?“取决于”。我认为这是正确的——但是,请看我的问题:在FF4(和FF3)将放入事件循环的情况下(我认为这样做是不正确的;这是一个实现“细节”)。我所知道的仅有两种情况是
alert
(例如海森堡)和
XHR
。我不确定这是否真的是一个bug或“开放”的解释。好吧,这似乎是我所希望的最好的解决方案。HTML5会有什么变化?你是指网络工作者吗?
var fartResult
function waitAMinuteThenFart (callback) {
  function fart () {
    fartResult = 'fart'
    callback(fartResult)
  }
  setTimeout(fart, 1000*60)
}
waitAMinuteThenFart(function (result) { alert(result) })