其服務器端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