如何在Javascript中实现“函数超时” – 不只是’setTimeout’

前端之家收集整理的这篇文章主要介绍了如何在Javascript中实现“函数超时” – 不只是’setTimeout’前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何在 Javascript中实现 timeout,而不是window.timeout,但是像会话超时或套接字超时 – 基本上是一个“功能超时”
@H_301_3@A specified period of time that will be allowed to elapse in a system
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.

@H_301_3@具体来说,我想要一个观察定时器,观察功能的执行时间,如果达到或超过指定时间,观察计时器将停止/通知执行功能.

@H_301_3@任何帮助是极大的赞赏!非常感谢.

解决方法

我不完全清楚你在问什么,但我认为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@例如,以下是如何在加载映像时放置超时:

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;
}
原文链接:https://www.f2er.com/js/151977.html

猜你在找的JavaScript相关文章