![](/img/trans.png)
[英]Javascript calling public method from private one within same object
[英]calling an object method with a setTimeout function from within the same object in Javascript
OBeen用这个把我的头撞在桌子上,我已经尝试了在SE上找到的答案。 请帮忙。
我有一个轮询API以获得新数据的函数。 我只想让函数每10000毫秒重复一次。 我认为以下方法会起作用:
//SURVIVORS_OBJECT
//Store the suvivor object and append the map markers and some additional parameters to it
var survivorMarkers;
function dz_survivorMarkers(){
//The survivors will be stored as an 'armaMapMarker' object
this.survivors = {};
//Clear a survivor from the list because by id (eg: has not been returned in our query)
this.clearSurvivor = function(pId){
this.survivors[pId].marker.setMap(null);
delete this.survivors[pId];
};
//make the api request from the overwatch data api
this.getSurvivorsRequest = function(){
console.log('UDBG:::survivorMarkers.getSurvivors ENTERED');
//the callback function is passed as well
api.getSurvivors(this.setSurvivors)
};
//Set survivors
//This is the big one - here we will loop through all our existing survivors and check
// if they have been returned in the new reponse. If so, we will update their position on
// the map and add a poly line from their last position to their new one
//We will also check if their info window is open, and will open it again for the user
//The detail window will be checked if it is open too, and it's contents will be refreshed
this.setSurvivors = function(pResponse) {
console.log('UDBG:::survivorMarkers.setSurvivors ENTERED');
console.log(pResponse);
// try {
if(pResponse.errors.length > 0) {
exceptionHandler.e('SRV100',pResponse.errors.message);
} else {
//First go through all our existing survivors, and see if they are in this request too
var newSurvivors = {};
for(var id in pResponse.records) {
//console.log('UDBG:::survivorMarkers.setSurvivors looping through survivor[' + id + ']');
var newSurvivor = new armaMapMarker('SURVIVOR', pResponse.records[id]);
//check if this record is in our existing list of survivors
if(this.survivors != null && this.survivors[id] != null) {
//set our interface options if any
newSurvivor.detailWindowIsOpen = this.survivors[id].detailWindowIsOpen;
newSurvivor.infoWindowIsOpen = this.survivors[id].infoWindowIsOpen;
//And clear the old data
this.clearSurvivor(id);
}
newSurvivors[id] = newSurvivor;
}
//Now go through all our old survivors, and see if they were NOT in the response and can be removed
for(var id in this.survivors) {
if(pResponse.records[id] == null) {
this.clearSurvivor(id);
}
}
this.survivors = newSurvivors;
}
// } catch (e) {
// alert(e);
// }
setInterval(function(){survivorMarkers.getSurvivorsRequest()},5000);
}
}
它将运行一次,但是第二次将出现异常:
Uncaught TypeError: Object [object global] has no method 'clearSurvivor'
在任何地方都没有定义survivorMarkers
,仅声明了。 如果您打算调用新实例,则需要按照以下步骤进行操作。 您还需要将setInterval
更改为setTimeout
,否则,您将在每个API调用完成时生成一个新的时间间隔,而不是在先前的请求完成时生成一个新的请求。 因此,我们有以下内容。
setTimeout(function(){
this.getSurvivorsRequest();
}.bind(this), 5000);
也许:
var thiz = this;
setTimeout(function(){
thiz.getSurvivorsRequest();
}, 5000);
最后,您传递的回调this.setSurvivors
未绑定到实例,因此在全局上调用,请使用api.getSurvivors(this.setSurvivors.bind(this))
修复。
您创建的对象实例应该是this.getSurvivorsRequest()
而不是survivorMarkers
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.