16:48:07 # Life Nodejsのpromise と for 文。 Promiseを書いているとFor文のループでPromiseをつなげてみようとか思う時がある。 しかし、for 文の変数のインスタンスはfunctionで一つなので、クロージャー実行時にみえるiの値はfor文が終わった時の値だったりする。 つまり
for (var i = 0; i < 10; ++i) { promise = promise.then(function() { dosomething(i); }); }
は以下と同じなのだ。
for (var i = 0; i < 10; ++i) { promise = promise.then(function() { dosomething(10); }); }
Javascriptはfunction() {} で変数のスコープが切れるという変な言語で、{}は単なる飾りだったりする。 だとするとmapのようにループの各回でfunction()を呼び出すという仕組みのほうがまだ直感的なのかもしれない。 ほんとうかなぁ。
[0,1,2,3,4,5,6,7,8,9].map(function(i) {promise = promise.then(function() { dosomething(i); });}); for (var i = 0; i < 10; ++i) { function(i) { promise = promise.then(function() { dosomething(i); }); }(i); }