javascript - 告诉javascript停止执行代码并在函数中间做后台工作

标签 javascript concurrency greasemonkey

对标题感到抱歉,但无法提出任何真正翔实和简洁的内容。

我的情况是我正在启动一个 setTimeout,我希望它能够在 JS 函数中间运行(它用于解决将 GM 函数注入(inject)网页的问题)。

unsafeWindow.testG = function(key, dValue){
var rValue;
setTimeout(function(){rValue = GM_getValue(key, dValue);}, 0);
alert(rValue);
alert(rValue);
return(rValue);
}

在三个测试中,rValue 仍然是未定义的(这是有道理的,因为 JS 大部分是单线程的)。

所以我想到了2个解决方案。

最喜欢的: 无论如何告诉 JS 在函数中间休眠并处理后台内容(如超时)?

其他: 有谁知道什么时候会调用这个超时?也许在这个函数执行之后但在调用它再次启动之前? 在这种情况下,使 rValue 全局化可以解决问题(但会使编码稍微困惑一些)。

还是等到所有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 线程时才会执行超时函数可用,或者仅在没有其他脚本运行时可用。

关于javascript - 告诉javascript停止执行代码并在函数中间做后台工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6159432/

相关文章:

java - 在java中跨多个进程更新单个对象

javascript - 在本地重新分配全局变量,而不在全局范围内更改它们。 JavaScript

haskell - 在 Haskell 中内存 IO 计算

java - 简单的Java并发问题

javascript - 设置 @grant 值时无法使用所需的库

javascript - XPath 无法单击 Greasemonkey 脚本中的按钮

javascript - 检查 Gmail 按钮的 javascript 调用

javascript - 将对象分解为此属性

javascript - PHP PDO 插入语句未通过

javascript - pgp.as.format() 中的“默认”选项