非同期メソッドを書きやすく拡張されたIcedCoffeeScript が登場

IcedCoffeeScript

IcedCoffeeScriptなんてのができていた。(フォーク元は最新のv1.2.0)
非同期関連を書きやすくしたもの。その意味ではtame.jsなどとコンセプトは同じ。
生成されるコードはIcedCoffeeScript -> CoffeeScript

使い方

公式サンプルより

search = (keyword, cb) ->
  host = "http://search.twitter.com/"
  url = "#{host}/search.json?q=#{keyword}&callback=?"
  await $.getJSON url, defer json
  cb json.results

await の非同期関数の返り値を、defer 受け取ってそのクロージャに吐き出す。直列に記述されているようだが、実際にはawait以下はコールバックの中になる。(その操作を隠蔽している)
非常にシンプル。

await for ~も使えるらしい。

out = []
await 
  for k,i in keywords
    search k, defer out[i]

雑感

生成されるコードを覗くと、resultとかlaunchとかの名前空間を平気で汚していて、せめてアンダーバープレフィックスを付けてほしい気持ちはある(CoffeeScriptは_refs1みたいな感じ)

自分はちょっとまだ信頼できないので使わないかなといった印象
これがメジャーになるのは考えにくいとは思うが、本家でも議論されている非同期メソッドAPI提案として実装されたのはGJだと思う。本家で採用されたら使ってもいい、ぐらい。

そういえば自分もこんなことできるやつを書いてみた、けど使ってない。

fs = require 'fs'
main = ->
  err,txt1 <- fs.readFile 'hello1.txt', next
  err,txt2 <- fs.readFile 'hello2.txt', next
  err,txt3 <- fs.readFile 'hello3.txt', next
  console.log i.toString() for i in [txt1,txt2,txt3]
main()

CoffeeScriptの文法拡張して非同期でネストが深くならないようにしてみた - mizchi log


みんなが納得できるシンタックスが提案されて採用されるといいですね