What Jason said is totally correct in his answer but I thought I would give it a shot, to better clarify.
This is actually a classic closure problem. Typically it would look something like:
for(var i = 0; i < 10; i++){
setTimeout(function(){
console.log(i);
},i * 1000)
}
The novice would expect the console to show:
0
(0 seconds pass...)
1
(1 second passes...)
2
(etc..)
But that just isn't the case! What you would actually see is the number 10
getting logged 10 times (1x per second)!
"Why does that happen?" Great question. Closure scope. The for
loop above lacks closure scope because in javascript, only functions (lambdas) have closure scope!
See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures
However! Your attempt would have achieved the desired output if you had tried this:
json.objects.forEach(function(obj,index,collection) {
setTimeout(function(){
console.log('foobar');
self.insertDesignJsonObject(obj, index);
}, index * 5000);
});
Because you have access to the "closur-ed" index
variable - you can rely on its state being the expected state when the function (lambda) is invoked!
Other Resources:
How do JavaScript closures work?
http://javascript.info/tutorial/closures
http://code.tutsplus.com/tutorials/closures-front-to-back--net-24869
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…