2015年5月14日 (木曜日)

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); }
	
Junichi Uekawa