0

我在 javascript 中有一个对象。从对象外部调用对象中的方法。我希望此方法在 200 毫秒后调用自身(一种递归但不完全),直到满足条件。

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?

4

2 回答 2

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 函数。

于 2013-10-16T08:08:38.597 回答
1

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

this.setSearchResult如果你直接在你的方法中使用它,那么using会起作用。但是在setTimeout回调函数中使用它,它会引用该window对象,因为setTimeout它是window. 要解决此问题,请存储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);
于 2013-10-16T08:14:52.597 回答