2013-01-10 57 views
1

我有關於setTimeout的各種問題: - 在我的代碼中,我用clearTimeout(content.idTimeout)清理了特定idTiemout的超時,但是如何清除所有超時? 我有一個模型:有關setTimeout使用backbone.js的各種問題。清理和恢復超時

var ContentModel = Backbone.Model.extend({ 
URL: "http://localhost/example.php",  
requestType: "POST", 
dataType: "json", 
data: "", //Set the value outside the model 
idTimeout: "", 
initialize: function() { 
_.bindAll(this); 
}, 
startSend: function (Data) { }, 
reply: function (Data) { 
    var dataJson = eval(Data);    
    console.log(dataJson); 
    this.idTimeout = setTimeout(this.ajaxRequest(),4000); 
}, 
problems: function (Data) { }, 
ajaxRequest: function() { 
    $.ajax({ 
     async:true, 
     type: this.requestType, dataType: this.dataType, 
     url: this.URL, data: this.data, 
     beforeSend:this.startSend, success: this.reply, 
     timeout:4000, error:this.problems 
    }); 
} 

和清潔超時視圖(片段):

initialize: function() { 
    _.bindAll(this); 
    this.model = new ContentCollection(); 
    this.model.on("add", this.contentAdded); 
     this.model.on("remove", this.removeContent);  
}, 
contentAdded: function(content) { //run it when add a model 
    if (content.view == null) { 
    var template_name = 'cam';              
    content.view = new ContentView({model: content,template: $.trim($("[template='"+ template_name +"'] div").html() || "Template not found!")}); 
    $("div.camBox").empty();     
    content.ajaxRequest();        
    this.$el.find(".content").find("div.camBox").append(content.view.render().el);            
    }     
}, 
removeContent: function(content) { 
    if (content.view != null) { 
     content.view.remove();    
    } 
    clearTimeout(content.idTimeout); 
    content.clear(); //Clear the properties of the model 
} 

- 當焦點在其他窗口如何清潔超時並恢復它的時候回報? 也許用對焦法。下一個代碼

$('html').focus(function() { 
    clearTimeout(content.idTimeout); 
}); 

in contentAdded不起作用。

編輯:

http://stackoverflow.com/questions/14258596/way-to-stop-the-running-of-a-javascript-web-application-when-the-focus-is-上OTH

+0

您清晰的JavaScript超時被路過返回超時的整數ID 'setTimeout()'到'clearTimeout()'中。你必須保存'setTimeout()'的返回值才能清除它。在你的代碼中,我看到一個對'setTimeout()'的引用,但它生成並返回的ID不會被保存。 – marekful

+0

現在,在您編輯之後,您可以將timout ID保存到'reply()'函數內的'this.idTimeout'中。這將創建一個名爲idTimout的函數(對象)的屬性。後來當你將'content.idTimeout'傳遞給'clearTimeout'時,'content'不包含'setTimeout'返回的ID,因爲它不是你保存它的''reply'對象。 – marekful

+0

這是關於上下文的......你可以爲'$ .ajax'指定一個'context'參數。這樣'this'關鍵字指向你在AJAX調用的所有回調函數內指定的對象。 – marekful

回答

3

一種解決方案可能是:

指定的(多個)超時ID的數組。

window.timeouts = []; 

每次調用setTimeout的時間:

timeouts.push(setTimeout(...)); 

然後,如果你想停止所有超時:

for(var i in timeouts) { 
    clearTimeout(timeouts[i]); 
} 
+0

好主意!現在,我必須解決焦點功能,以避免請求的客戶端過載。 – vicenrele

+0

你知道如何恢復超時清理? – vicenrele

+2

您無法恢復超時。一旦用'clearTimeout'清除它,它就消失了......你可以用'setTimeout'創建一個新的。或者另一種做法是使用'setInterval',不清除它,並在傳遞給'setInterval'的函數中使用一些條件來決定何時執行你清除超時時不會執行的代碼。 – marekful