如何在
Javascript中实现
timeout,而不是window.timeout,但是像会话超时或套接字超时 – 基本上是一个“功能超时”
@H_301_3@A specified period of time that will be allowed to elapse in a system@H_301_3@具体来说,我想要一个观察定时器,观察功能的执行时间,如果达到或超过指定时间,观察计时器将停止/通知执行功能. @H_301_3@任何帮助是极大的赞赏!非常感谢.
before a specified event is to take place,unless another specified
event occurs first; in either case,the period is terminated when
either event takes place.
解决方法
我不完全清楚你在问什么,但我认为Javascript不能按照你想要的方式工作,所以无法做到这一点.例如,不能做常规的函数调用,直到操作完成或者一定的时间量(以先到者为准).这可以在javascript之外实现,并通过javascript进行暴露(与同步ajax调用一样),但是不能在纯JavaScript中使用常规功能.
@H_301_3@与其他语言不同,Javascript是单线程的,这样一个函数执行一个定时器将永远不会执行(除了web工作人员,但是他们可以做的非常有限).定时器只能在功能完成执行时执行.因此,您甚至不能在同步功能和定时器之间共享进度变量,因此定时器无法“检查”功能的进度.
@H_301_3@如果你的代码是完全独立的(没有访问任何你的全局变量,没有调用你的其他函数,并且没有访问DOM),那么你可以在一个网络工作者较新的浏览器),并在主线程中使用计时器.当web-worker代码完成时,它会向主线程发送一条消息,其结果是.当主线程接收到该消息时,它会停止定时器.如果定时器在接收结果之前触发,可能会杀死网络工作者.但是,您的代码不得不受到网络工作者的限制.
@H_301_3@也可以使用异步操作(因为它们通过Javascript的单线程工作更好)这样做:
@H_301_3@>启动异步操作,如ajax调用或加载映像.
>使用setTimeout()启动一个定时器,用于您的超时时间.
>如果定时器在异步操作完成之前触发,则停止异步操作(使用API取消它).
>如果异步操作在定时器触发之前完成,则使用clearTimeout()取消定时器并继续. @H_301_3@例如,以下是如何在加载映像时放置超时:
>使用setTimeout()启动一个定时器,用于您的超时时间.
>如果定时器在异步操作完成之前触发,则停止异步操作(使用API取消它).
>如果异步操作在定时器触发之前完成,则使用clearTimeout()取消定时器并继续. @H_301_3@例如,以下是如何在加载映像时放置超时:
function loadImage(url,maxTime,data,fnSuccess,fnFail) { var img = new Image(); var timer = setTimeout(function() { timer = null; fnFail(data,url); },maxTime); img.onLoad = function() { if (timer) { clearTimeout(timer); fnSuccess(data,img); } } img.onAbort = img.onError = function() { clearTimeout(timer); fnFail(data,url); } img.src = url; }