Priyanka
Priyanka

Reputation: 232

Angular $timeout within loop fails

I am using angular $timeout as,

 $scope.alltexts = ["hii" , "hello" , "hehe"]
 var sendtime = 60000

 for (var i = 0; i < $scope.alltexts.length; i++) {
   var text = $scope.alltexts[i]
   $setTimeout(function() {}, (function(){$scope.addtext(text)}, sendtime + (i * 60000)));
 };

 $scope.addtext = function(text){
  console.log(text)
 }

But after each one minute it only console "hehe". Means it considers only last value. Please let me know how should I get proper results.

Upvotes: 3

Views: 295

Answers (2)

Wasiq Muhammad
Wasiq Muhammad

Reputation: 3118

Try this

$scope.alltexts = ["hii" , "hello" , "hehe"]
 var sendtime = 60000

 for (var i = 0; i < $scope.alltexts.length; i++) {
   (function(i){
   var text = $scope.alltexts[i]
   $setTimeout(function() {}, (function(){$scope.addtext(text)}, sendtime + (i * 60000)));
   })(i)
 };

 $scope.addtext = function(text){
  console.log(text)
 }

Upvotes: 1

Thalaivar
Thalaivar

Reputation: 23632

Too much of closures today, you are always passing the last index... a closure will create a new scope for each iteration.

 $scope.alltexts = ["hii" , "hello" , "hehe"]
 var sendtime = 60000

 for (var i = 0; i < $scope.alltexts.length; i++) {
   (function(i){
   var text = $scope.alltexts[i]
   $setTimeout(function() {}, (function(){$scope.addtext(text)}, sendtime + (i * 60000)));
   })(i)
 };

 $scope.addtext = function(text){
  console.log(text)
 }

Upvotes: 2

Related Questions