setTimeout为函数参数添加条件

时间:2015-02-12 12:19:57

标签: javascript settimeout

基本上,我想要实现的目标如下。我有这个功能' ontimeout'期望函数作为参数,并且只有在给定时间(3s)之后条件为真时才调用此函数:

EventStreamSource.prototype.ontimeout = function(func){
    setTimeout(function(){
        if(this.source.readyState == 0){
            func()}
    }, 3000);   
};

在另一个脚本中,可能会有以下代码:

source.ontimeout(function(){
    toastr.error('Command stream not established.')
})

但是,这似乎不起作用。我并不是那么熟悉javascript,我确信我犯了一个错误的错误,但是我也一直在这么长时间不知所措,所以有一双额外的眼睛会很棒对此。

所以实际的问题是如何调用' func'在一个新的函数()。

提前致谢!

2 个答案:

答案 0 :(得分:1)

问题是您传递给setTimeout函数的函数会创建自己的this上下文,因此this不再引用EventStreamSource的实例。通过如下所示的闭包传递this.source

EventStreamSource.prototype.ontimeout = function(func){
    (function(source){ // accept source as an argument to the closure
        setTimeout(function(){
            if(source.readyState == 0){
                func()}
        }, 3000);
    })(this.source); // pass this.source to the closure
};

答案 1 :(得分:0)

没有IIFE的另一个解决方案(或闭包或任何你想要调用它的东西)但是它解决了同样的问题:传递给setTimeout的函数创建了自己的this范围,所以首先我们取消引用this.source变成一个变量。

EventStreamSource.prototype.ontimeout = function(func){
    var thisSource = this.source;

    setTimeout(function(){
        if(thisSource.readyState == 0){
            func()}
    }, 3000);   
};