下記のようなコールバックを取る関数を順次呼び出したいとします。
a = (cb) -> setTimeout (-> console.log "a" ; do cb), 300
b = (cb) -> setTimeout (-> console.log "b" ; do cb), 200
c = (cb) -> setTimeout (-> console.log "c" ; do cb), 100
こういう結果が欲しい。
$ seq. a.coffee
a
b
c
素直なやり方はこう。
a ->
b ->
c ->
これだと、個数が固定になっちゃいます。なんとか任意の個数実行できるようにしたい。
そこで、賢いやり方。
_ = require 'underscore'
do _.reduceRight [a, b, c], ((acc, f) -> -> f acc), _.identity
結果はどちらもこうなります。