[解決済み】jQuery deferredはどのように使用することができますか?
質問
jQuery 1.5では、新しいDeferredオブジェクトと付属のメソッドが追加されました。
.when
,
.Deferred
そして
._Deferred
.
を使ったことがない人のために
.Deferred
をアノテーションしています。
ソース
.
これらの新しいメソッドは、どのような使い方が考えられるのか、どのようにパターンに当てはめればいいのか。
を既に読んでいます。 API と ソース だから、それが何をするものなのかは知っています。質問は、これらの新機能を日常的なコードでどのように使用できるかということです。
私は単純な 例 AJAXリクエストを順番に呼び出すバッファークラス。(前のものが終了した後、次のものが始まります)。
/* Class: Buffer
* methods: append
*
* Constructor: takes a function which will be the task handler to be called
*
* .append appends a task to the buffer. Buffer will only call a task when the
* previous task has finished
*/
var Buffer = function(handler) {
var tasks = [];
// empty resolved deferred object
var deferred = $.when();
// handle the next object
function handleNextTask() {
// if the current deferred task has resolved and there are more tasks
if (deferred.isResolved() && tasks.length > 0) {
// grab a task
var task = tasks.shift();
// set the deferred to be deferred returned from the handler
deferred = handler(task);
// if its not a deferred object then set it to be an empty deferred object
if (!(deferred && deferred.promise)) {
deferred = $.when();
}
// if we have tasks left then handle the next one when the current one
// is done.
if (tasks.length > 0) {
deferred.done(handleNextTask);
}
}
}
// appends a task.
this.append = function(task) {
// add to the array
tasks.push(task);
// handle the next task
handleNextTask();
};
};
のデモや可能な使い方を探しています。
.Deferred
と
.when
.
の例も見てみたいものです。
._Deferred
.
リンク先が新しい
jQuery.ajax
のソースを例にとると、ズルいですね。
特に、ある操作が同期で行われるか非同期で行われるかを抽象化したときに、どのようなテクニックがあるのかに興味があります。
どのように解決するのか?
私が思いつく最も良い使用例は、AJAXレスポンスをキャッシュすることです。 以下は、以下の例を修正したものです。 Rebecca Murpheyのイントロダクション記事 :
var cache = {};
function getData( val ){
// return either the cached value or jqXHR object wrapped Promise
return $.when(
cache[ val ] ||
$.ajax('/foo/', {
data: { value: val },
dataType: 'json',
success: function( resp ){
cache[ val ] = resp;
}
})
);
}
getData('foo').then(function(resp){
// do something with the response, which may
// or may not have been retrieved using an
// XHR request.
});
基本的に、その値が以前に一度リクエストされている場合は、キャッシュからすぐに返されます。 そうでない場合は、AJAXリクエストでデータを取得し、キャッシュに追加します。 そのため
$.when
/
.then
はこのようなことは一切気にしません。
.then()
ハンドラです。
jQuery.when()
は、非 Promise/Deferred を Completed として処理し、直ちにすべての
.done()
または
.then()
をチェーン上に表示します。
Deferredsはタスクが非同期で動作するかしないか、その条件をコードから抽象化したい場合に最適です。
を使用したもう一つの実例は
$.when
ヘルパーを使用します。
$.when($.getJSON('/some/data/'), $.get('template.tpl')).then(function (data, tmpl) {
$(tmpl) // create a jQuery object out of the template
.tmpl(data) // compile it
.appendTo("#target"); // insert it into the DOM
});
関連
-
[解決済み】Uncaught ReferenceError: angular is not defined - AngularJSが動作しない。
-
[解決済み】XMLパースエラー:ルート要素が見つからない コンソールの場所 FF
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] jQueryで要素が非表示になっているかどうかを確認するには?
-
[解決済み] jQueryでチェックボックスに "checked "を設定する
-
[解決済み] どのラジオボタンが選択されているかをjQueryで知るにはどうしたらよいですか?
-
[解決済み] jQueryでページを更新するにはどうすればよいですか?
-
[解決済み】別のウェブページにリダイレクトするにはどうすればいいですか?
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み】jQueryでチェックボックスがチェックされているかどうかを確認するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 Uncaught TypeError: data.push is not a function
-
[解決済み】Uncaught TypeError: nullのプロパティ'value'を読み取ることができない
-
[解決済み] テスト
-
[解決済み】Reactのeslintエラーはpropsの検証で見つからない
-
[解決済み】JavaScript ランタイムエラー:'$'が未定義です。
-
[解決済み】Jestが予期しないトークンに遭遇した
-
[解決済み】Javascript、[オブジェクトHTMLInputElement]を表示中。]
-
[解決済み】中央値の計算 - javascript
-
[解決済み] 繰延べと約束
-
[解決済み] jQuery Deferredsの配列はどのように扱うのですか?重複