これを踏まえて、「処理が終わるまでポーリング」の実装(script要素内)を以下に示す。div要素は非表示になっている。実行されてリクエストが実行される。渡された関数が実行される。なければresolvedなDeferredから作成したPromiseを返す。このように3秒間隔でポーリングされる。渡された関数がただちに実行されて、実行中であることを示している部分を非表示にして、完了したことを知らせる要素を表示する。指定したcallback関数の処理に時間がかかる場合に問題があるというような記事もちらほら見かける。使ったことがないのでよくわからないが。2014jQueryのAjax関数はPromiseを実装したjqXHRを返す以前の関連する記事:jQueryで非同期な処理が終わるのを待つにはDeferredを使うDeferredの復習jqXHRjQueryのAJAX関数(ajax(),get(),put())はjqXHRオブジェクトを返す。jqXHRはPromiseを実装している。このjqXHRはAjax関数によるリクエストが成功するとresolvedになり、失敗するとrejectedになる。よって下記の2つのコードは同様な動作となる。以前の関連する記事:jQueryで非同期な処理が終わるのを待つにはDeferredを使う以前、jQueryのDeferredについての記事を書いて、大雑把には理解できた。Deferredについて最もわかりやすい解説は参考1,2だと思う。概念的には決して難しくないのだが、Deferredのメソッドが各々どんな引数を取り、どんな値を返すのかとか、日本語のリファレンスを読んでも読み取れなかった(書いてなかった?)こととかがある。いうところをところをあらためてまとめた。返すPromiseオブジェクトとは何か。以前の記事では参考3から下記の引用を示した。Promiseは、ユーザがDeferredの状態の変更を防ぐための、Deferredのメソッドのサブセット(then,done,fail等)を提供する。それってつまりどういうことかというと、参考2から引用すると.promise()という謎のメソッドが書かれていますが、これはDeferredオブジェクトから.resolve()や.reject()といった「状態を変更するメソッド」を取り除いたサブセットを返します。Deferredオブジェクトを直接返してしまうと、受け取った側で状態を変更できてしまい、非同期処理そのものが本当に終わったのかどうか保証が取れなくなります。これを防ぐため、.promise()によるクリーニング作業が必要になるわけです。