memocon プログラミングのメモや物欲日記、雑記等

jQueryのdeferredで処理をthenで直列に繋げた時にうまく待機してくれなかった話

2015年08月25日 01時19分

久々にJavaScriptのソースとにらめっこする機会があった。

そこで気になったのが非同期処理の連結方法。

こんな感じで非同期処理が書かれていた。

非同期処理の完了部分に次の非同期処理の呼び出しが記述されていて見通しが悪く、
なんとかしたかったので検索してみたら速攻でdeferred, Promise辺りの単語にあたった。

既にjQueryを使っていたのでjQueryのdeferredを使ってみることにした。

非同期処理の連結が外に出せて非常にスッキリした。

func1とfunc2の順番が逆になっても変更箇所は最後の呼び出し部分だけで済むし良い感じ。
とか思って実行してみたらfunc1の完了を待たずにfunc2とfunc3が実行されてしまう。

すっごい悩んで調べまくったらjQueryのバージョンが1.7でthenの挙動が1.8以上と違ったのが原因だった。
徒労感が半端ない理由で余計疲れた。

jQuery.Deferredを使うんだったら最低でも1.8以上にしないとネット上によく書かれているthenによる非同期処理の直列繋ぎはできないので要注意。