monthly gimite

試験運用中。

[js] 次世代JavaScriptのawait (Deferred Functions)

この記事で知ったのですが、次世代JavaScriptのawaitという機能が楽しそうです。

function sleep(ms) {
  var deferred = new Deferred();
  window.setTimeout(function() { deferred.callback(); }, ms);
  return deferred;
}

function foo() {
  for (var i = 0; i < 10; ++i) {
    console.log(i);
    await sleep(1000);
  }
}

foo();

これで1秒おきにconsole.logに出力されます。awaitというキーワードで非同期関数を同期関数風に呼び出せます。

実はCoffeeScriptでも使える(つまり、CoffeeScriptコンパイルしてさらにTraceurでコンパイルするすれば動く)ことを発見しました。

sleep = (ms)->
  deferred = new Deferred()
  window.setTimeout((-> deferred.callback()), ms)
  return deferred

foo = ->
  for i in [0...10]
    console.log(i)
    await sleep(1000)
    null

foo()

CoffeeScriptはawaitを関数だと思ってawait(sleep(1000))に変換しますが、余計な括弧があっても通るので、ちゃんと動きます。そのあとにnullが必要なのが微妙ですが*1

*1:nullを入れないと_results.push(await(sleep(1000) ) );が生成されてエラーに。