其服务器端JavaScript(犀牛引擎),所以setTimeout不可用。如何异步运行一个函数?如何在不使用setTimeout的情况下异步运行javascript函数?
14
A
回答
5
查看Rhino Examples页面上的Multithreaded Script Execution
示例。基本上,JavaScript不直接支持线程,但您可以使用Java线程来实现您正在寻找的内容。
36
您可以使用java.util.Timer
和java.util.TimerTask
推出自己的设置/清除超时,并设置/清除间隔功能:
var setTimeout,
clearTimeout,
setInterval,
clearInterval;
(function() {
var timer = new java.util.Timer();
var counter = 1;
var ids = {};
setTimeout = function (fn,delay) {
var id = counter++;
ids[id] = new JavaAdapter(java.util.TimerTask,{run: fn});
timer.schedule(ids[id],delay);
return id;
}
clearTimeout = function (id) {
ids[id].cancel();
timer.purge();
delete ids[id];
}
setInterval = function (fn,delay) {
var id = counter++;
ids[id] = new JavaAdapter(java.util.TimerTask,{run: fn});
timer.schedule(ids[id],delay,delay);
return id;
}
clearInterval = clearTimeout;
})()
2
使用ScheduledThreadPoolExecutor,犀牛1.7R4兼容,并提出了另一个版本的@Nikita-Beloglazov:
var setTimeout, clearTimeout, setInterval, clearInterval;
(function() {
var executor = new java.util.concurrent.Executors.newScheduledThreadPool(1);
var counter = 1;
var ids = {};
setTimeout = function (fn,delay) {
var id = counter++;
var runnable = new JavaAdapter(java.lang.Runnable, {run: fn});
ids[id] = executor.schedule(runnable, delay,
java.util.concurrent.TimeUnit.MILLISECONDS);
return id;
}
clearTimeout = function (id) {
ids[id].cancel(false);
executor.purge();
delete ids[id];
}
setInterval = function (fn,delay) {
var id = counter++;
var runnable = new JavaAdapter(java.lang.Runnable, {run: fn});
ids[id] = executor.scheduleAtFixedRate(runnable, delay, delay,
java.util.concurrent.TimeUnit.MILLISECONDS);
return id;
}
clearInterval = clearTimeout;
})()
相关问题
- 1. 如何在没有setTimeout的情况下暂停Javascript异步函数?
- 2. 如何在不等待的情况下调用异步函数?
- 3. javascript函数在不被调用的情况下运行
- 4. 如何在不破坏函数的情况下暂停执行setTimeout调用?
- 5. 如何在没有ByRef的情况下处理异步函数?
- 6. Javascript - 如果异步情况下
- 7. 如何使函数运行异步
- 8. setTimeout on异步函数
- 9. 如何在不使用HTML的情况下在Notepad ++中运行JavaScript?
- 10. 如何在不使用服务器的情况下运行node.js
- 11. 如何在不使用./script.py的情况下运行python脚本?
- 12. 如何在不使用CURL的情况下运行HTTP请求
- 13. 如何在没有承诺的情况下运行异步承诺?
- 14. 如何在不调用它的情况下自动运行js(作为函数)?
- 15. 在不运行函数的情况下创建Python Timer
- 16. 如何在不立即运行的情况下将参数传递给函数?
- 17. 如何在下面的情况下取消异步任务
- 18. 如何在不标记所有方法异步的情况下使用Await Task.Delay?
- 19. 如何在不使用mod函数的情况下进行模数计算
- 20. 如何异步运行函数(XMLHttpRequest)
- 21. 如何异步运行elisp函数?
- 22. Google Analytics JavaScript如何在没有异步/争用条件问题的情况下加载并运行?
- 23. Javasctipt函数在未被调用的情况下运行?
- 24. 函数参数如何在不提及函数体的情况下使用?
- 25. 使用setTimeout运行的stop函数
- 26. 在不等待非异步方法的情况下调用异步方法?
- 27. 如何在不调用它的情况下查询javascript函数的参数
- 28. 如何在没有文件名的情况下运行javascript
- 29. 为什么Javascript显示setTimeout函数同步和异步输出?
- 30. 为什么这个javascript函数在未被调用的情况下运行?
Whit您的代码片段,我能够运行茉莉花无需使用EnvJS即可在Rhino中进行测试。谢谢! – 2011-05-28 15:25:01
我希望我能给你100个upvotes,非常棒。非常感谢。 – Upgradingdave 2011-08-12 17:03:46
太棒了。谢谢!为了与浏览器完全兼容,您还需要处理延迟的遗漏。 MDN表示,根据HTML5规范的最小延迟是4ms,所以添加以下内容:if(delay == null){delay = 4; } – 2012-04-20 10:08:56