是否可以在JavaScript中实现等效于setTimeout()
的函数?如果是,那么最好的方法是什么?
function setTimeout(callback, time_in_ms)
{
// Implementation of time elapse of time_in_ms
callback();
}
我出于好奇而问这个问题。一个简单的"不,这是不可能的" 也足以回答这个问题。
答案 0 :(得分:5)
我可以自己在javascript中实现
def reportItems(self): l = self.listWidget dy = l.item(0).font().pointSize() ystart = l.viewport().geometry().y() h = l.viewport().geometry().height() print ystart, h, dy itlist = [] itcomplist = [] for y in range(ystart, ystart+h, (29/8)*dy): #empirical value i = l.itemAt(0, y) if not i in itlist: itlist.append(i) itcomplist.append((y, l.row(i))) for it in itcomplist: y, i = it print y, l.item(i).text()[:30]
吗?
不 - 没有其他一些本机异步API。您可以使用setTimeout()
,网络工作者setInterval
或实际上与requestAnimationFrame
在同一事件循环中运行的任何内容来实现它。但如果有一个原因导致您无法使用内置setTimeout
,那么您的环境可能还存在其他问题 - 因此具体情况取决于具体情况。
答案 1 :(得分:1)
同步(非异步)setTimeout
等价物将是这样的:
function myTimeout(fun, milisecs) {
var nowT = Date.now();
while(Date.now()< nowT+milisecs){
continue;
}
fun();
}
function consout() {
console.log('The future arrived now!');
}
myTimeout(consout,2000);
&#13;
但是,作为Bergi mentioned,您可能需要一个异步API来避免拖延浏览器的JavaScript执行。
Worker具有多线程功能以允许此功能,具有myWorker.port.start()
和myWorker.terminate()
等功能...我从未需要使用Workers或类似API创建内容,但是也许你可以在这个领域多研究一下(如果是这样的话我也不应该完成你的作业)。