基本上,我想要实现的目标如下。我有这个功能' 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'在一个新的函数()。
提前致谢!
答案 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);
};