jQueryの$Deferred、$.when非同期操作
17404 ワード
<!--
.article {
box-shadow: 0 3px 7px rgba(0,0,0,0.1);
border-radius: 4px;
background: #f7ebe6;
font-family:『マイクロソフト・ブラック』;・13;
margin-bottom: 20px;
}
.head {
height: 38px;
border-radius: 4px 4px 0 0;
box-shadow: 0 6px 10px -6px rgba(0,0,0,0.1);
padding-left: 20px;
color: #939393;
line-height: 38px;
font-size: 16px;
}
.con {
padding: 10px 20px 0;
line-height: 24px;
font-size: 12px;
color: #939393;
background: #fff;
}
-->
前言
ajaxがサーバデータを要求しても、すぐに結果が得られないなど、Webページには時間がかかる操作がよくあります.これらの操作が実行する後に別の操作を行う必要がある場合は、コールバック関数に$を置く必要があります.Deferredとは、jQueryがコールバック操作を処理するために使用されるものです.jQueryの$Deferred対$Callbacksは依存しています$を見てください.Callbacksはコールバックを実行します.
$.上の操作を実現するためにDeferred
$.Deferredの3チーム抽象
1、resolve-》done-》$.Callbacks('once memory')-』成功-』は一度だけトリガーされます
2、reject-》fail-》$.Callbacks('once memory')-'失敗-'は一度だけトリガーされます
3、notify-》progress-》$.Callbacks('memory')-'通知-'はresolveまたはrejectまでトリガーされます.
次は興味深い使い方です.memoryの記憶機能です.
deferredとpromise
$.Deferredにはdeferredとpromiseの2つの遅延オブジェクトがあります.deferredにはすべてのメソッドが含まれていますが、promiseには遅延オブジェクトの状態を変更する3つのメソッドresolve、reject、notifyは含まれていません.このような利点は、オブジェクトの状態が混乱しないように、オブジェクトの状態を変更する方法を提供しない場合がある.
その他の方法
1、state:遅延オブジェクトの状態を返す
pending:オブジェクト作成時のステータス
resolved:コールバック成功-失敗とnotifyのコールバックが無効になります
rejected:コールバックに失敗-成功とnotifyのコールバックは無効になります
2、always:成功しても失敗してもトリガーされます
3、then:伝達の3つの方法はそれぞれ3つの操作を処理する
4、pipe:遅延オブジェクトフィルタ?
resolve、done、reject、fail、notify、progress
$.when
1、$.when(deferred):遅延オブジェクト.
2、$.when(deferred, deferred,...):多くの遅延オブジェクトがresolve()を呼び出したときにdoneを実行します.遅延オブジェクトがreject()を呼び出すとfail()が実行されます.
3、パラメータが遅延オブジェクトでない場合はこのパラメータをスキップして成功を表し、パラメータが遅延オブジェクトでない場合は成功し、doneが実行されます.
NOTE:成功または失敗したコールバック関数のパラメータはwhenのパラメータに対応し、パラメータが遅延オブジェクトコールバック関数であればundefinedを得、遅延オブジェクトではなくパラメータ値を得る.
.article {
box-shadow: 0 3px 7px rgba(0,0,0,0.1);
border-radius: 4px;
background: #f7ebe6;
font-family:『マイクロソフト・ブラック』;・13;
margin-bottom: 20px;
}
.head {
height: 38px;
border-radius: 4px 4px 0 0;
box-shadow: 0 6px 10px -6px rgba(0,0,0,0.1);
padding-left: 20px;
color: #939393;
line-height: 38px;
font-size: 16px;
}
.con {
padding: 10px 20px 0;
line-height: 24px;
font-size: 12px;
color: #939393;
background: #fff;
}
-->
前言
ajaxがサーバデータを要求しても、すぐに結果が得られないなど、Webページには時間がかかる操作がよくあります.これらの操作が実行する後に別の操作を行う必要がある場合は、コールバック関数に$を置く必要があります.Deferredとは、jQueryがコールバック操作を処理するために使用されるものです.jQueryの$Deferred対$Callbacksは依存しています$を見てください.Callbacksはコールバックを実行します.
1 var callbacks = $.Callbacks();
2 setTimeout(function(){
3 console.log(1); // 1
4 callbacks.fire(); // 2 add ( , )
5 }, 1000);
6 callbacks.add(function(){
7 console.log(2);
8 });
$.上の操作を実現するためにDeferred
1 var deferred = $.Deferred();
2 setTimeout(function(){
3 console.log(1); // 1
4 deferred.resolve();// 2
5 }, 1000);
6 deferred.done(function(){
7 console.log(2);
8 });
$.Deferredの3チーム抽象
1、resolve-》done-》$.Callbacks('once memory')-』成功-』は一度だけトリガーされます
2、reject-》fail-》$.Callbacks('once memory')-'失敗-'は一度だけトリガーされます
3、notify-》progress-》$.Callbacks('memory')-'通知-'はresolveまたはrejectまでトリガーされます.
1 var deferred = $.Deferred();
2 setTimeout(function(){
3 //deferred.resolve(); // success
4 deferred.reject(); // error
5 //deferred.notify(); // progressing
6 }, 1000);
7 deferred.done(function(){
8 console.log('success');
9 }).fail(function(){
10 console.log('error');
11 }).progress(function(){
12 console.log('progressing');
13 });
次は興味深い使い方です.memoryの記憶機能です.
1 var deferred = $.Deferred();
2 setTimeout(function(){
3 deferred.resolve();// 1
4 }, 100);
5 deferred.done(function(){
6 console.log(1);
7 });
8 $('#btn').on('click', function () {
9 deferred.done(function(){
10 console.log(2); // 2...
11 });
12 });
deferredとpromise
$.Deferredにはdeferredとpromiseの2つの遅延オブジェクトがあります.deferredにはすべてのメソッドが含まれていますが、promiseには遅延オブジェクトの状態を変更する3つのメソッドresolve、reject、notifyは含まれていません.このような利点は、オブジェクトの状態が混乱しないように、オブジェクトの状態を変更する方法を提供しない場合がある.
1 function fn(){
2 var deferred = $.Deferred();
3 setTimeout(function(){
4 deferred.resolve();// , 。
5 });
6 return deferred;
7 }
8 var newDeferred = fn();
9 newDeferred.done(function(){
10 console.log('success');
11 }).fail(function(){
12 console.log('error');
13 });
14 newDeferred.reject(); // error
1 function fn(){
2 var deferred = $.Deferred();
3 setTimeout(function(){
4 deferred.resolve();// success
5 });
6 return deferred.promise();
7 }
8 var newDeferred = fn();
9 newDeferred.done(function(){
10 console.log('success');
11 }).fail(function(){
12 console.log('error');
13 });
14 newDeferred.reject(); // reject
その他の方法
1、state:遅延オブジェクトの状態を返す
pending:オブジェクト作成時のステータス
resolved:コールバック成功-失敗とnotifyのコールバックが無効になります
rejected:コールバックに失敗-成功とnotifyのコールバックは無効になります
2、always:成功しても失敗してもトリガーされます
3、then:伝達の3つの方法はそれぞれ3つの操作を処理する
4、pipe:遅延オブジェクトフィルタ?
resolve、done、reject、fail、notify、progress
$.when
1、$.when(deferred):遅延オブジェクト.
2、$.when(deferred, deferred,...):多くの遅延オブジェクトがresolve()を呼び出したときにdoneを実行します.遅延オブジェクトがreject()を呼び出すとfail()が実行されます.
1 function fn1(){
2 var deferred = $.Deferred();
3 setTimeout(function(){
4 deferred.resolve();
5 }, 1000);
6 return deferred.promise();
7 }
8 function fn2(){
9 var deferred = $.Deferred();
10 setTimeout(function(){
11 deferred.resolve();
12 }, 1000);
13 return deferred.promise();
14 }
15 $.when(fn1(), fn2()).done(function(){
16 console.log('success'); // resolve() success
17 }).fail(function(){
18 console.log('error'); // reject() error
19 });
3、パラメータが遅延オブジェクトでない場合はこのパラメータをスキップして成功を表し、パラメータが遅延オブジェクトでない場合は成功し、doneが実行されます.
1 function fn1(){
2 var deferred = $.Deferred();
3 setTimeout(function(){
4 deferred.resolve();
5 }, 1000);
6 return deferred.promise();
7 }
8 $.when(fn1(), 123).done(function(){
9 console.log('success'); // fn1()->resolve() success
10 }).fail(function(){
11 console.log('error'); // fn1()->reject() error
12 });
NOTE:成功または失敗したコールバック関数のパラメータはwhenのパラメータに対応し、パラメータが遅延オブジェクトコールバック関数であればundefinedを得、遅延オブジェクトではなくパラメータ値を得る.
1 function fn1(){
2 var deferred = $.Deferred();
3 setTimeout(function(){
4 deferred.resolve();
5 }, 1000);
6 return deferred.promise();
7 }
8 $.when(fn1(), 123).done(function(arg1, arg2){
9 console.log(arg1);// undefined
10 console.log(arg2);//123
11 console.log('success'); // fn1()->resolve() success
12 }).fail(function(){
13 console.log('error'); // fn1()->reject() error
14 });