茄子在线看片免费人成视频,午夜福利精品a在线观看,国产高清自产拍在线观看,久久综合久久狠狠综合

    <s id="ddbnn"></s>
  • <sub id="ddbnn"><ol id="ddbnn"></ol></sub>

  • <legend id="ddbnn"></legend><s id="ddbnn"></s>

    深入解析jQuery中Deferred的deferred.promise()方法
    來(lái)源:易賢網(wǎng) 閱讀:1113 次 日期:2016-07-06 10:32:13
    溫馨提示:易賢網(wǎng)小編為您整理了“深入解析jQuery中Deferred的deferred.promise()方法”,方便廣大網(wǎng)友查閱!

    這篇文章主要介紹了jQuery中Deferred的deferred.promise()方法,提醒千萬(wàn)要注意deferred.promise()與jQuery的.promise() 實(shí)例方法的區(qū)別,需要的朋友可以參考下

    deferred.promise() 和 .promise()

    這兩個(gè)API語(yǔ)法幾乎一樣,但是有著很大的差別。deferred.promise()是Deferred實(shí)例的一個(gè)方法,他返回一個(gè)Deferred.Promise實(shí)例。一個(gè)Deferred.Promise對(duì)象可以理解為是deferred對(duì)象的一個(gè)視圖,它只包含deferred對(duì)象的一組方法,包括:done(),then(),fail(),isResolved(), isRejected(), always(),這些方法只能觀察一個(gè)deferred的狀態(tài),而無(wú)法更改deferred對(duì)象的內(nèi)在狀態(tài)。這非常適合于API的封裝。例如一個(gè)deferred對(duì)象的持有者可以根據(jù)自己的需要控制deferred狀態(tài)的狀態(tài)(resolved或者rejected),但是可以把這個(gè)deferred對(duì)象的Promise對(duì)象返回給其它的觀察者,觀察者只能觀察狀態(tài)的變化綁定相應(yīng)的回調(diào)函數(shù),但是無(wú)法更改deferred對(duì)象的內(nèi)在狀態(tài),從而起到很好的隔離保護(hù)作用。

    deferred.promise()

    $(function(){ 

      // 

      var deferred = $.Deferred(); 

      var promise = deferred.promise(); 

      var doSomething = function(promise) { 

        promise.done(function(){ 

          alert('deferred resolved.'); 

        }); 

      }; 

      deferred.resolve(); 

      doSomething(promise); 

    }) 

    deferred.promise()也可以接受一個(gè)object參數(shù),此時(shí)傳入的object將被賦予Promise的方法,并作為結(jié)果返回。

    // Existing object 

    var obj = { 

     hello: function( name ) { 

      alert( "Hello " + name ); 

     } 

    }, 

    // Create a Deferred 

    defer = $.Deferred(); 

    // Set object as a promise 

    defer.promise( obj ); 

    // Resolve the deferred 

    defer.resolve( "John" ); 

    // Use the object as a Promise 

    obj.done(function( name ) { 

     this.hello( name ); // will alert "Hello John" 

    }).hello( "Karl" ); // will alert "Hello Karl" 

    deferred.promise() 只是阻止其他代碼來(lái)改變這個(gè) deferred 對(duì)象的狀態(tài)。可以理解成,通過(guò) deferred.promise() 方法返回的 deferred promise 對(duì)象,是沒(méi)有 resolve ,reject, progress , resolveWith, rejectWith , progressWith 這些可以改變狀態(tài)的方法,你只能使用 done, then ,fail 等方法添加 handler 或者判斷狀態(tài)。

    deferred.promise() 改變不了 deferred 對(duì)象的狀態(tài),作用也不是保證目前的狀態(tài)不變,它只是保證你不能通過(guò) deferred.promise() 返回的 deferred promise 對(duì)象改變 deferred 對(duì)象的狀態(tài)。如果我們這個(gè)地方直接返回 dtd,也是可以工作的,.done 的處理函數(shù)還是會(huì)等到 dtd.resolve() 之后才會(huì)執(zhí)行.

    具體在那篇博客的例子, 如果我們把代碼改成如下的形式:

    var dtd = $.Deferred(); // 新建一個(gè)deferred對(duì)象

    var wait = function(dtd){

      var tasks = function(){

        alert("執(zhí)行完畢!");

        dtd.resolve(); // 改變deferred對(duì)象的執(zhí)行狀態(tài)

      };

      setTimeout(tasks,5000);

      return dtd;

    };

    $.when(wait(dtd))

    .done(function(){ alert("哈哈,成功了!"); })

    .fail(function(){ alert("出錯(cuò)啦!"); });

    這樣的執(zhí)行結(jié)果和先前返回 dtd.promise 的結(jié)果是一樣的。

    差別在什么地方呢?如果我們把 $.when 的這塊的代碼改成這樣的:

    var d = wait(dtd);

    $.when(d)

    .done(function(){ alert("哈哈,成功了!"); })

    .fail(function(){ alert("出錯(cuò)啦!"); });

    d.resolve();

    我們會(huì)發(fā)現(xiàn) alert(“哈哈,成功了!”) 會(huì)立即執(zhí)行,“執(zhí)行完畢”卻需要5秒后才彈出來(lái)。

    但是如果我們 wait 函數(shù)最后是 return dtd.promise() 這里 d.resolve() 就會(huì)報(bào)錯(cuò)了,因?yàn)閷?duì)象 d 不存在 resolve() 方法。

    同樣如果我們把代碼改成:

    var dtd = $.Deferred(); // 新建一個(gè)deferred對(duì)象

    var wait = function(dtd){

      var tasks = function(){

         alert("執(zhí)行完畢!");

         dtd.resolve(); // 改變deferred對(duì)象的執(zhí)行狀態(tài)

       };

       setTimeout(tasks,5000);

       return dtd.promise();

    };

    dtd.resolve();

    $.when( wait(dtd))

    .done(function(){ alert("哈哈,成功了!"); })

    .fail(function(){ alert("出錯(cuò)啦!"); });

    我們也可以發(fā)現(xiàn) alert(“哈哈,成功了!”) 會(huì)立即執(zhí)行,因?yàn)?dtd 這個(gè) deferred 對(duì)象在被傳入 wait 之前,已經(jīng)被 resolve() 了,而 deferred 對(duì)象一旦被 resolve 或者 reject 之后,狀態(tài)是不會(huì)改變的。

    然后我們?cè)侔?$.wait 這塊的代碼改成:

    $.when( wait(dtd))

    .done(function(){ alert("哈哈,成功了!"); })

    .fail(function(){ alert("出錯(cuò)啦!"); });

    dtd.resolve();

    我們也會(huì)發(fā)現(xiàn) alert(“哈哈,成功了!”); 被立即執(zhí)行,雖然 wait(dtd) 執(zhí)行的時(shí)候, dtd 還沒(méi)有被 resolve,而且 wait 方法返回的是 dtd.promise(), 但是 dtd 這個(gè)原始的 deferred 對(duì)象是暴露在外面的,我們還是可以從外面改變它的狀態(tài)。

    于是,如果我們真的不想讓其他代碼能改變 wait 方法內(nèi)部的 deferred 對(duì)象的狀態(tài),那我們應(yīng)該寫(xiě)成這樣:

    var wait = function(){

      var dtd = $.Deferred(); // 新建一個(gè)deferred對(duì)象

      var tasks = function(){

        alert("執(zhí)行完畢!");

         dtd.resolve(); // 改變deferred對(duì)象的執(zhí)行狀態(tài)

       };

       setTimeout(tasks,5000);

       return dtd.promise();

    };

    $.when( wait())

    .done(function(){ alert("哈哈,成功了!"); })

    .fail(function(){ alert("出錯(cuò)啦!"); });

    也就是不要把 deferred 直接暴露出來(lái),最后返回 deferred.promise() ,讓其他地方的代碼只能添加 handler 。

    .promise()

    首先這不是Deferred實(shí)例的方法!該方法是jQuery實(shí)例的方法。該方法用于一組類(lèi)型的動(dòng)作(例如動(dòng)畫(huà))全部完成后返回一個(gè)Promise對(duì)象,供事件監(jiān)聽(tīng)器監(jiān)聽(tīng)其狀態(tài)并執(zhí)行相應(yīng)的處理函數(shù)。

    該方法接受兩個(gè)可選參數(shù):.promise( [type,] [target] )

    type:隊(duì)列的類(lèi)型,默認(rèn)值是fx,fx即jQuery對(duì)象的動(dòng)畫(huà). 

    targetObject :要賦予Promise行為的對(duì)象,

    這兩個(gè)參數(shù)是可選的。其中第一個(gè)參數(shù)(我)目前除了fx還沒(méi)有找到其他的值類(lèi)型。因此一般都是用于動(dòng)畫(huà)的監(jiān)控,在動(dòng)畫(huà)完成后做一些操作。

    例子:沒(méi)有動(dòng)畫(huà)效果直接返回一個(gè)resolved狀態(tài)的promise對(duì)象

    var div = $( "<div />" ); 

    div.promise().done(function( arg1 ) { 

     // 將會(huì)被馬上觸發(fā) 

     alert( this === div && arg1 === div ); 

    }); 

    例子:在動(dòng)畫(huà)效果全部完成后觸發(fā)done()監(jiān)聽(tīng)函數(shù)

    <!DOCTYPE html> 

    <html> 

    <head> 

     <style> 

    div { 

     height: 50px; width: 50px; 

     float: left; margin-right: 10px; 

     display: none; background-color: #090; 

    </style> 

     <script src="http://code.jquery.com/jquery-latest.js"></script> 

    </head> 

    <body> 

    <button>Go</button> 

    <p>Ready...</p> 

    <div></div> 

    <div></div> 

    <div></div> 

    <div></div> 

    <script> 

    $("button").bind( "click", function() { 

     $("p").append( "Started..."); 

     //每個(gè)div執(zhí)行動(dòng)畫(huà)效果 

     $("div").each(function( i ) { 

      $( this ).fadeIn().fadeOut( 1000 * (i+1) ); 

     }); 

     //$("div")包含一組div,在所有的div都完成自己的動(dòng)畫(huà)效果后觸發(fā)done()函數(shù) 

     $( "div" ).promise().done(function() { 

      $( "p" ).append( " Finished! " ); 

     }); 

    }); 

    </script> 

    </body> 

    </html> 

    更多信息請(qǐng)查看網(wǎng)絡(luò)編程
    易賢網(wǎng)手機(jī)網(wǎng)站地址:深入解析jQuery中Deferred的deferred.promise()方法
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢?yōu)闇?zhǔn)!

    2026上岸·考公考編培訓(xùn)報(bào)班

    • 報(bào)班類(lèi)型
    • 姓名
    • 手機(jī)號(hào)
    • 驗(yàn)證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
    工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
    云南網(wǎng)警備案專(zhuān)用圖標(biāo)
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
    云南網(wǎng)警報(bào)警專(zhuān)用圖標(biāo)