Skip to content

Instantly share code, notes, and snippets.

@minodisk
Last active December 19, 2015 08:39
Show Gist options
  • Select an option

  • Save minodisk/5926833 to your computer and use it in GitHub Desktop.

Select an option

Save minodisk/5926833 to your computer and use it in GitHub Desktop.
$.whenのまずい設計をラップ
do ->
$.extend
parallel: (ds) ->
d = new $.Deferred
$.when.apply($, ds)
.done if ds.length <= 1
(results...) -> d.resolve [ results ]
else
(results...) -> d.resolve results
.fail d.reject
d.promise()
parallelEach: (items, iterator) ->
$.parallel _.map items, iterator
@minodisk
Copy link
Copy Markdown
Author

minodisk commented Jul 4, 2013

$.parallelの特徴

  • $.parallelに渡されるタスクの個数に寄らず、doneは1個のarrayを引数としてコールされる
  • $.parallelの引数は配列→タスクの個数に寄らず書き方が変わらない
  • $.parallelEachは_.mapに通して$.parallelをコールするシュガー。Deferred.loopのparallel版が欲しかっただけ。

@minodisk
Copy link
Copy Markdown
Author

minodisk commented Jul 4, 2013

$.whenの設計がまずいと思う理由

引数の数によってdoneに渡される引数の意味が変わってしまう

  • 1個の時
$.when($.ajax('foo.txt'))
.done (data, status, xhr) ->
  • 複数の時
$.when($.ajax('foo.txt'), $.ajax('bar.txt'))
.done ([fooData, fooStatus, fooXhr], [barData, barStatus, barXhr]) ->

1個の時のdoneの引数はタスクの結果なのに、複数の時はそれぞれのタスクの結果を配列に込めた上で複数の引数としてコールされる。
タスクの個数でコールバックの引数の意味が変わるなんて本当にひどい。
特にwhenにfor文で回して作ったdeferredsとか渡すケースでは、doneで分岐が必要になってカオス。

複数の引数を指定す時と、配列を渡すときで見た目が変わる

単純に醜い = バグが見つかりにくい

  • $.when
task = $.ajax('foo.txt')
tasks = [$.ajax('foo.txt'), $.ajax('bar.txt')]
$.when(task)
$.when.apply($, tasks)
  • $.parallel
task = $.ajax('foo.txt')
tasks = [$.ajax('foo.txt'), $.ajax('bar.txt')]
$.parallel(task)
$.parallel(tasks)

@minodisk
Copy link
Copy Markdown
Author

minodisk commented Jul 4, 2013

↑これって全部jsDeferredのパクリ。jsDeferredの設計が綺麗すぎるだけに$.Deferredの設計のまずさが引き立つ。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment