2013-10-16 127 views
0

我在JavaScript中有一个对象。对象中的方法是从对象外部调用的。我希望这种方法在200ms后调用自己(递归类型,但不完全),直到满足条件。我在函数中没有定义

this.setSearchResult = function(data){ 
    if(initiated){ 
     doSetSearchResult(data); 
    }else{ 
     console.log("Map is not initiated yet. Waiting 200 ms"); 
     setTimeout(function(){setSearchResult(data);}, 200); // <- Error 
    } 
} 

调用setSearchResult做是这样的:

mapView = new MapView(imageData); 
mapView.setSearchResult(data); 

我得到的错误是ReferenceError: setSearchResult is not defined.

一个克服错误的方法是通过改变setTimeout调用此:

setTimeout(function(){mapView.setSearchResult(data);}, 200); 

但我觉得很丑陋(尽管它可能会工作在 我的应用程序)。

有没有正确的方法呢?我是否必须在setSearchResult中使用setTimeout?

回答

2

我认为这应该工作:

this.setSearchResult = function(data){ 
    if(initiated){ 
     doSetSearchResult(data); 
    }else{ 
     var _this = this; 

     console.log("Map is not initiated yet. Waiting 200 ms"); 
     setTimeout(function(){_this.setSearchResult(data);}, 200); // <- Error 
    } 
} 

这是因为你在一个回调函数,所以你不必访问setSearchResult功能。

1

setSearchResult是你的MapView对象的方法。因此你必须这样称呼它。在方法本身内部,您可以使用关键字this来引用方法所属的对象。

如果您直接在方法中使用this.setSearchResult,它将会起作用。但在你的setTimeout回调函数中使用它,它会引用window对象,因为setTimeoutwindow的一种方法。要解决此问题,请将this存储在另一个变量中,并使用它指向正确的对象。

// Store this in a variable called self 
var self = this; 

setTimeout(function() { 
    // Inside this function "this" points to window, because setTimeout 
    // is a method of window. Use the previously declared self instead. 
    self.setSearchResult(data); 
}, 200); 
+0

谢谢你的解释。它真的帮助我理解。 –

相关问题