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による非同期処理の直列繋ぎはできないので要注意。

メモ】jQueryのclick関数がsafariだけでエラー。TypeError: ‘undefined’ is not a function (evaluating xxxx.click()と出る

2014年03月12日 15時07分

Lionのsafari(5.1.7)でjQueryのclick()関数を実行したらTypeError: ‘undefined’ is not a function (evaluating xxxx.click()と出た。

エラーメッセージでググると以下のページを発見。

http://stackoverflow.com/questions/12744202/undefined-is-not-a-function-evaluating-el-click-in-safari

「言語定義はclick()関数はHTMLInputElementにのみだよ」って感じかな。
確かにaタグに対して実行していたので納得。
でもsafariもバージョン上げるとエラー出ないんだよ。

納得いかないまま該当箇所に関してはjQuery使わずにevent作って対応。

IEの旧バージョンがディスられまくっててsafariの旧バージョンが皆に忘れされれているのは母数の少なさに加えてOSの安さがある。
この症状報告した会社の人もLionから無償でアップデートできるんだから特別な理由がない限りさっさと最新OSに変えて欲しい。