「1から100まで出力する」のJavaScriptのPromise使った例

追記:冷静になるとこの記事なんか変なので、あとで修正します。参照しないように。

forやめろ -- LL Diver 2014 LT枠

forを使わないループ、簡単な例はみんな思いつくからいいとして、一番ややこしいやつ考えてたんだけど、やっぱり無駄にPromise酷使する例だと思った。

追記:この例はちょっとミスってた。正しいコードを末尾に載せる

CoffeeScript

# Serialized Sync Promise
[1..100]
  .map (i) -> new Promise (d) -> console.log i; d()
  .reduce ((l, p) -> l.then p), Promise.resolve()

JavaScript

(function() {
  _results = [];
  for (_i = 1; _i <= 100; _i++){ _results.push(_i); }
  return _results;
}).apply(this).map(function(i) {
  return new Promise(function(d) {
    console.log(i);
    return d();
  });
}).reduce((function(l, p) {
  return l.then(p);
}), Promise.resolve());

ちゃんと同期実行される。

ちなみに自分はこのコードはd() を呼ぶタイミングで時系列制御が自由自在なので、プロダクションでもよく書く。

追記:正しいコード

# Serialized Sync Promise
[1..100]
  .map (i) -> new Promise (d) -> setTimeout -> console.log i; d()
  .reduce ((l, p) -> l.then p), Promise.resolve()

やっぱ非同期じゃないとこの例意味が無い