繁体   English   中英

从Javascript的同一对象中使用setTimeout函数调用对象方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM