Promise與Defer認識


1、deffer對象:jquery的回掉函數解決方案;含義是延遲到未來某個點再執行;


2、$.ajax鏈式寫法:

 

$.ajax( "test.php" )
     .done( function () { console.log( "success" ); })   
     .fail( function () { console.log( "fail" ); })

 

3、指定同一操作的多個回調函數:

 

$.ajax( "test.php" )
     .done( function () { console.log( "success" ); })   
     .fail( function () { console.log( "fail" ); })
     .done( function () { console.log( "success two" ); })

 

4、為多個操作指定回調函數:若其中一個執行失敗則執行fail回調;

 

$.when($.ajax( "test.php" ), $.ajax( "test2.php" ))
    .done( function () { console.log( "success" ); })   
    .fail( function () { console.log( "fail" ); })

 

5、普通操作的回調函數接口:

 

var  dtd = $.Deferred();  // 新建一個deferred對象
var  wait =  function  (dtd) {
     var  tasks =  function () {
         alert( "執行完畢!" );
         dtd.resole();  // 改變deferred對象的執行狀態從”未完成“改為“已完成”,從而觸發done()方法;
         // dtd.reject(); // 從“未完成”改為“已失敗”,觸發fail()方法;
     }
     setTimeout(tasks, ,5000);
     return  dtd;
}
$.when(wait(dtd))
     .done( function () { console.log( "success" ); })   
     .fail( function () { console.log( "fail" ); })
 
     // dtd.resolve() 可以立即改變狀態,5s后再觸發多一次

 

6、用promise優化 全局defer對象,防止執行狀態被外部改變:

 

var  wait =  function  () {
     var  dtd = $.Deferred();  // 新建一個deferred對象
     var  tasks =  function () {
         alert( "執行完畢!" );
         dtd.resole();  // 改變deferred對象的執行狀態從”未完成“改為“已完成”,從而觸發done()方法;
     }
     setTimeout(tasks, ,5000);
     return  dtd.promise();  // 返回promise對象
};
$.when(wait())
     .done( function () { console.log( "success" ); })   
     .fail( function () { console.log( "fail" ); })

 

7、另一種防止執行狀態被外部改變的方法:用deferred的構建函數:

 

$.Deferred(wait)  // 接受一個函數名作為參數,注意是函數名
    .done( function () { console.log( "success" ); })   
    .fail( function () { console.log( "fail" ); })

 

8、最后一種防止執行狀態被外部改變的方法:在wait對象上部署deferred接口:

 

var  dtd = $.Defferred();
var  wait =  function (dtd) {
     var  tasks =  function () {
         alert( "執行完畢!" );
         dtd.resole();  // 改變deferred對象的執行狀態從”未完成“改為“已完成”,從而觸發done()方法;
     }
     setTimeout(tasks, ,5000);
 
}
dtd.promise(wait);
wait.done( function () { console.log( "success" ); })        
     .fail( function () { console.log( "fail" ); })
 
wait(dtd);

 

小結:deferred對象的方法:
(1) $.Deferred() 生成一個deferred對象。
(2) deferred.done() 指定操作成功時的回調函數
(3) deferred.fail() 指定操作失敗時的回調函數
(4) deferred.promise() 沒有參數時,返回一個新的deferred對象,該對象的運行狀態無法被改變;接受參數時,作用為在參數對象上部署deferred接口。
(5) deferred.resolve() 手動改變deferred對象的運行狀態為"已完成",從而立即觸發done()方法。
(6)deferred.reject() 這個方法與deferred.resolve()正好相反,調用后將deferred對象的運行狀態變為"已失敗",從而立即觸發fail()方法。
(7) $.when() 為多個操作指定回調函數。
(8)deferred.then()有時為了省事,可以把done()和fail()合在一起寫,這就是then()方法。
$.when($.ajax( "/main.php" )).then(successFunc, failureFunc );
如果then()有兩個參數,那么第一個參數是done()方法的回調函數,第二個參數是fail()方法的回調方法。
如果then()只有一個參數,那么等同於done()。
(9)deferred.always()這個方法也是用來指定回調函數的,它的作用是,不管調用的是deferred.resolve()還是deferred.reject(),最后總是執行。
$.ajax( "test.html" ).always( function() { alert("已執行!");} );
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM