2

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'
4

2 回答 2

4

没有survivorMarkers定义,只有声明。如果您打算调用新实例,则需要按照以下几行进行操作。您还需要将其更改setIntervalsetTimeout,否则,您将在每次 API 调用完成时生成一个新的间隔,而不是在前一个请求完成时生成一个新请求。因此,我们有以下内容。

setTimeout(function(){
    this.getSurvivorsRequest();
}.bind(this), 5000);

也许:

var thiz = this;
setTimeout(function(){
    thiz.getSurvivorsRequest();
}, 5000);

最后,您传递的回调this.setSurvivors未绑定到实例,而是在全局上调用,使用api.getSurvivors(this.setSurvivors.bind(this)).

于 2013-07-15T07:45:20.640 回答
0

this.getSurvivorsRequest()它不应该是survivorMarkers您创建的对象实例。

于 2013-07-15T07:43:36.817 回答