微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何在 Javascript中实现 timeout,而不是window.timeout,但是像会话超时或套接字超时 – 基本上是一个功能超时”

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.

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

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

解决方法

我不完全清楚你在问什么,但我认为Javascript不能按照你想要的方式工作,所以无法做到这一点.例如,不能做常规的函数调用,直到操作完成或者一定的时间量(以先到者为准).这可以在javascript之外实现,并通过javascript进行暴露(与同步ajax调用一样),但是不能在纯JavaScript中使用常规功能.

与其他语言不同,Javascript是单线程的,这样一个函数执行一个定时器将永远不会执行(除了web工作人员,但是他们可以做的非常有限).定时器只能在功能完成执行时执行.因此,您甚至不能在同步功能和定时器之间共享进度变量,因此定时器无法“检查”功能的进度.

如果你的代码是完全独立的(没有访问任何你的全局变量,没有调用你的其他函数,并且没有访问DOM),那么你可以在一个网络工作者较新的浏览器),并在主线程中使用计时器.当web-worker代码完成时,它会向主线程发送一条消息,其结果是.当主线程接收到该消息时,它会停止定时器.如果定时器在接收结果之前触发,可能会杀死网络工作者.但是,您的代码不得不受到网络工作者的限制.

也可以使用异步操作(因为它们通过Javascript的单线程工作更好)这样做:

>启动异步操作,如ajax调用或加载映像.
>使用setTimeout()启动一个定时器,用于您的超时时间.
>如果定时器在异步操作完成之前触发,则停止异步操作(使用API​​取消它).
>如果异步操作在定时器触发之前完成,则使用clearTimeout()取消定时器并继续.

例如,以下是如何在加载映像时放置超时:

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.jb51.cc/js/151977.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐