我目前遇到一个问题,我有一个javascript对象试图使用setInterval来调用自身内部的私有函数。但是,当我尝试调用它时,它无法找到该对象。我有一种感觉,因为window.setInterval试图从外部调用对象,但没有对该对象的引用。 FWIW - 我无法使用公共功能。
基本要求是我可能需要拥有此对象的多个实例来跟踪一次发生的多个上传。如果你有一个比现在更好的设计,或者可以使当前的设计正常工作,那么我全都听见了。
以下代码旨在持续ping网络服务以获取文件上传的状态:
var FileUploader = function(uploadKey) {
var intervalId;
var UpdateProgress = function() {
$.get('someWebService', {},
function(json) {
alert('success');
});
};
return {
BeginTrackProgress: function() {
intervalId = window.setInterval('UpdateProgress()', 1500);
},
EndTrackProgress: function() {
clearInterval(intervalId);
}
};
};
这就是它的召唤方式:
var fileUploader = new FileUploader('myFileKey');
fileUploader.BeginTrackProgress();
答案 0 :(得分:8)
使用此
intervalId = window.setInterval(UpdateProgress, 1500);
带有文字参数的setInterval将eval
在全局范围内,UpdateProgress
无法访问。
答案 1 :(得分:2)
因为它是eval
表达式,所以它无权访问创建setInterval的范围。尝试:
intervalId = window.setInterval(UpdateProgress, 1500)
通常,最好尽可能避免使用eval
样式表达式。例如,如果您想从同一个计时器调用多个函数,则可以使用匿名函数而不是字符串。
window.setInterval(function () {
function1();
function2();
}, 1500)
另见
答案 2 :(得分:0)
+1给Andy E的头(我还不能投票,doh!)
如果你在被调用的函数中使用this
,那么可以解决的另一个问题是。
然后完全按照Andy的说法做这件事,应该可以帮助你。
var that = this;
window.setInterval(function() {
function1.apply(that);
function2.apply(that);
}, 1500);