Last active
December 19, 2015 08:39
-
-
Save minodisk/5926833 to your computer and use it in GitHub Desktop.
$.whenのまずい設計をラップ
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |
Author
Author
$.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)
Author
↑これって全部jsDeferredのパクリ。jsDeferredの設計が綺麗すぎるだけに$.Deferredの設計のまずさが引き立つ。
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
$.parallelの特徴