Javascript 具有setTimeInterval的多个计时器

Javascript 具有setTimeInterval的多个计时器,javascript,loops,timer,closures,setinterval,Javascript,Loops,Timer,Closures,Setinterval,我在循环中使用setInterval时遇到了一个问题。 我有一个函数subscribebeed(),它接受URL数组作为输入。 它循环遍历url数组,并使用setInterval函数将每个url订阅到getFeedAutomatically() 因此,如果数组中有三个URL,那么将调用3个setInterval。 问题是 1) 如何区分为哪个URL调用哪个setInterval。 2) 它在setInterval中导致运行时异常(我猜是因为javascript中的闭包问题) //构造函数 函数m

我在循环中使用setInterval时遇到了一个问题。 我有一个函数subscribebeed(),它接受URL数组作为输入。 它循环遍历url数组,并使用setInterval函数将每个url订阅到getFeedAutomatically()

因此,如果数组中有三个URL,那么将调用3个setInterval。 问题是 1) 如何区分为哪个URL调用哪个setInterval。 2) 它在setInterval中导致运行时异常(我猜是因为javascript中的闭包问题)

//构造函数
函数myfeed(){
this.feedArray=[];
}
myfeed.prototype.constructor=myfeed;
myfeed.prototype.subscribeFeed=函数(feedUrl){
var i=0;
var-url;
var计数=0;
var_this=这个;
var feedInfo={
url:[],
地位:“”
};
var urlinfo=[];
feedUrl=(数组的feedUrl实例)?feedUrl:[feedUrl];
//notifyInterval=(数组的notifyInterval实例)?notifyInterval:[notifyInterval];
对于(i=0;i
我在jsfiddle上发布了同样的消息


事先谢谢你

在做了一些原型设计之后,我找到了一个答案,答案是,将封口移到外面

function myclass(){

}
myclass.prototype.funone= function(){
    var counter =0;
    var timerID;
    timerID = setInterval( function(){
        alert(counter++);
    },1000);

}

myclass.prototype.funtwo= function(){
 var timerID2;
    var counter2 =50;
    timerID2 = setInterval( function(){
        alert(counter2++);
    },2000);    
}

myclass.prototype.funthree = function( ){

    var urlArray =["google.com","yahoo.com"];
    var timeArray =[15000,6000];
    var timerID ;
  for(var i=0;i<2; i++){   
      var url = urlArray[i];
      var timerinterval = timeArray[i];
    timerID =  this.register( url,timerinterval); 
  }       
}
myclass.prototype.register = function(url,timerInterval){

    var myUrl =url;
    var myTimer = timerInterval;
    var timerID  = setInterval( function(){
        alert(myUrl+"with"+ myTimer);
    },myTimer);      

}

var m = new myclass( );
m.funthree( ); 


http://jsfiddle.net/visibleinvisibly/Q4SBG/13/

The move the index binding from the setInterval and pass the url and time interval.
It works perfectly
函数myclass(){
}
myclass.prototype.funone=函数(){
var计数器=0;
var-timerID;
timerID=setInterval(函数(){
警报(计数器++);
},1000);
}
myclass.prototype.funtwo=函数(){
var-timerID2;
var=2=50;
timerID2=setInterval(函数(){
警报(计数器2++);
},2000);    
}
myclass.prototype.funthree=函数(){
var urlArray=[“google.com”,“yahoo.com”];
var timeArray=[150006000];
var-timerID;

对于(var i=0;i,您可能希望了解(在底部的“this variable”下)this
值的含义

代码中的错误可能与在循环中使用计数器以及根据计数器创建闭包有关。创建此类闭包的最简单方法是

for(i=0;i<len;i++){
  object.myCallback = (function(counter){
    return function(){
      doSomethingWith(counter);
    }
  }(i));
}
(i=0;i)的

for(i=0;i<len;i++){
  object.myCallback = (function(counter){
    return function(){
      doSomethingWith(counter);
    }
  }(i));
}
//constructor
function MyFeed(){
  this.feedArray = [];
}
MyFeed.prototype.subscribeFeed =function(feedUrl){
  var i=0,urlInfo=[];
  feedUrl = (feedUrl instanceof Array) ? feedUrl : [feedUrl];
  for (i = 0; i < feedUrl.length; i++) {
    feedUrl[i].isEnable=true;
    feedUrl[i].called=false;
    feedUrl[i].position=0;//not sure what this is supposed to do
    //Set the interval to get the feed.
    feedUrl[i].timerID = setTimeout(this.closures//changed this to timeout
      .getFeedUpdate(this)
      ,feedUrl[i].notifyInterval||100//changed default value
    );
    this.feedArray.push(feedUrl[i]);
    }
};
// The getFeedUpate function will make an Ajax request and coninue
MyFeed.prototype.getFeedUpdate = function( index ){
  console.log("in getFeedUpdate, this is now:",this);
  console.log("my feed url object:",this.feedArray[index].url);
};
//limit closure scope, define closure creators here
MyFeed.prototype.closures={
  //this.closures.getFeedUpdate(this)
  //  will return a closure that calls this.getFeedUpdate
  //  with correct parameters
  getFeedUpdate:function(me){
    var index = me.feedArray.length;
    return function(){
      me.getFeedUpdate(index);
    };
  }
};

//code to test adding single feed
var mf = new MyFeed();
mf.subscribeFeed({
  url:"I am last",
  notifyInterval:1000
});
//add another single feed
mf.subscribeFeed({
  url:"first.com"
});
//and another
mf.subscribeFeed({
  url:"second.com"
});
//and add some more feeds in an array of feeds
mf.subscribeFeed([
  {
    url:"third"
  },
  {
    url:"fifth"
  },
  {
    url:"no, I am last",
    notifyInterval:1500
  }
]);