jQuery의 $.Deferred、$.비동기 동작
17476 단어 deferred
.article {
box-shadow: 0 3px 7px rgba(0,0,0,0.1);
border-radius: 4px;
background: #f7ebe6;
font-family: "마이크로소프트 블랙",
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;
}
-->
전언
웹 페이지에서 aax가 서버 데이터를 요청하는 등 비교적 긴 시간이 걸리는 동작이 자주 나타나는데, 이러한 조작은 즉각 결과를 얻을 수 없다.만약 우리가 이 조작을 실행한 후에 다른 조작을 해야 한다면, 우리는 이 조작들을 리셋 함수에 두어야 한다. $.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 두 개의 지연 대상이 있습니다.deferred는 모든 방법을 포함하고,promise는 지연 대상의 상태를 바꾸는 세 가지 방법인 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: 전달 세 가지 방법으로 각각 세 가지 조작을 처리한다.
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 });