最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript異步回調的Promise模式封裝實例

 更新時間:2014年06月07日 09:27:15   作者:  
這篇文章主要介紹了JavaScript異步回調的Promise模式封裝實例,本文通過分析easyjs的源碼得出,實例均參考easyjs,需要的朋友可以參考下

網(wǎng)頁的交互越來越復雜,JavaScript 的異步操作也隨之越來越多。如常見的 ajax 請求,需要在請求完成時響應操作,請求通常是異步的,請求的過程中用戶還能進行其他的操作,不會對頁面進行阻塞,這種異步的交互效果對用戶來說是挺有友好的。但是對于開發(fā)者來說,要大量處理這種操作,就很不友好了。異步請求完成的操作必須預先定義在回調函數(shù)中,等到請求完成就必須調用這個函數(shù)。這種非線性的異步編程方式會讓開發(fā)者很不適應,同時也帶來了諸多的不便,增加了代碼的耦合度和復雜性,代碼的組織上也會很不優(yōu)雅,大大降低了代碼的可維護性。情況再復雜點,如果一個操作要等到多個異步 ajax 請求的完成才能進行,就會出現(xiàn)回調函數(shù)嵌套的情況,如果需要嵌套好幾層,那你就只能自求多福了。
先看看下面這個常見的異步函數(shù)。

復制代碼 代碼如下:

var showMsg = function(){
    setTimeout(function(){
        alert( 'hello' );
    }, 5000 );
};

如果要給該函數(shù)添加回調,通常會這么干。

復制代碼 代碼如下:

var showMsg = function( callback ){
    setTimeout(function(){
        alert( 'hello' );
        // 此處添加回調
        callback();
    }, 5000 );
};

如果是使用 easy.js 的 Promise,添加回調的方法就會優(yōu)雅多了,前提是需要將原函數(shù)封裝成一個 promise 實例。

復制代碼 代碼如下:

var showMsg = function(){
    // 構造promise實例
    var promise = new E.Promise();

    setTimeout(function(){
        alert( 'hello' );

        // 改變promise的狀態(tài)
        promise.resolve( 'done' );
    }, 5000 );

    // 返回promise實例
    return promise;
};

將一個普通的函數(shù)封裝成一個 promise 實例,有3個關鍵步驟,第一步是在函數(shù)內部構造一個 promise 實例,第二步是部署函數(shù)執(zhí)行完去改變 promise 的狀態(tài)為已完成,第三步就是返回這個 promise 實例。每個 promise 實例都有3種狀態(tài),分別為 pending(未完成)、resolved(已完成,成功)、rejected(已拒絕,失敗)。下面再來看看如何添加回調。

復制代碼 代碼如下:

showMsg().then(function( str ){
    // 回調添加到這里來了
    callback( str );
});

這樣就將回調函數(shù)和原來的異步函數(shù)徹底的分離了,從代碼組織上看,優(yōu)雅了很多。resolve 接受一個參數(shù),該參數(shù)就可以輕松實現(xiàn)將數(shù)據(jù)傳送給使用 then 方法添加的回調中。
對于 ajax 請求,easy.js 直接將 ajax 方法封裝成了 promise 對象,可以直接添加 then 方法來回調。

復制代碼 代碼如下:

E.ajax({
    url : 'test1.php',
    type : 'GET'
})
.then(function(){
    // 添加請求成功的回調
}, function(){
    // 添加請求失敗的回調
});

then 方法接受2個函數(shù)作為參數(shù),第一個函數(shù)是已完成的回調,第二個就是已失敗的回調。
如果有上面提到的多個 ajax 請求的情況呢?那么就要用到 when 這個方法了。該方法可以接受多個 promise 實例作為參數(shù)。

復制代碼 代碼如下:

var requests = E.when(E.ajax({
    url : 'test1.php',
    type : 'GET'
}), E.ajax({
    url : 'test2.php',
    type : 'GET'
}));

requests.then(function( arg1, arg2 ){
    console.log( 'success:' + arg1[0] + arg2[0] );
}, function( arg1, arg2 ){
    console.log( 'failure:' + arg1 + arg2  );
});

when 方法是將多個 promise 實例存到一個數(shù)組中,等到該數(shù)組的所有 promise 實例都是已完成狀態(tài)才去執(zhí)行已完成的回調,一旦有一個實例是已拒絕的狀態(tài),則立即執(zhí)行已拒絕的回調。

Promise 模式是 CommonJS 的規(guī)范之一。很多主流的 JavaScript 庫都有相應的實現(xiàn),如 jQuery 和 Dojo 中,都有 Deferred 去實現(xiàn)這些功能。在這里還是要吐槽下 jQuery 的 Deferred,撇開其內部使用,這應該用戶使用率最低的一個模塊了,這和其較復雜的使用方式有一定的關系。

相關文章

  • 整理Javascript基礎語法學習筆記

    整理Javascript基礎語法學習筆記

    整理Javascript基礎語法學習筆記,之前一系列的文章是跟我學習Javascript,本文就是進一步學習javascript基礎語法,希望大家繼續(xù)關注
    2015-11-11
  • layui實現(xiàn)給某一列加點擊事件

    layui實現(xiàn)給某一列加點擊事件

    今天小編就為大家分享一篇layui實現(xiàn)給某一列加點擊事件,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • Javascript 判斷兩個IP是否在同一網(wǎng)段實例代碼

    Javascript 判斷兩個IP是否在同一網(wǎng)段實例代碼

    javascript功能的強大之處是我們大家有目共睹的,幾天小編向大家介紹Javascript 判斷兩個IP是否在同一網(wǎng)段,感興趣的朋友可以參考一下
    2016-11-11
  • javascript表單驗證和Window詳解

    javascript表單驗證和Window詳解

    這篇文章主要詳細介紹了javascript表單驗證和Window,并附上了示例代碼,非常使用,對于我們更好的了解表單驗證和Window很有幫助,這里推薦給大家
    2014-12-12
  • JS校驗與最終登陸界面功能完整示例

    JS校驗與最終登陸界面功能完整示例

    這篇文章主要介紹了JS校驗與最終登陸界面功能,結合完整實例形式詳細分析了JavaScript登錄界面校驗功能與正則驗證相關操作技巧,需要的朋友可以參考下
    2020-01-01
  • js chrome瀏覽器判斷代碼

    js chrome瀏覽器判斷代碼

    今天發(fā)現(xiàn)chrome還是有一些獨一無二的東西,基于它們,我們就可以搞出基于特征的判定了。
    2010-03-03
  • IE6中鏈接A的href為javascript協(xié)議時不在當前頁面跳轉

    IE6中鏈接A的href為javascript協(xié)議時不在當前頁面跳轉

    IE6中當鏈接A的href為javascript協(xié)議時不能在當前頁面跳轉,本例給出有效的解決方法,大家不妨參考下
    2014-06-06
  • ES6   Promise基礎用法(resolve、reject、then、catch,all)

    ES6   Promise基礎用法(resolve、reject、then、catch,a

    Promise是JavaScript中處理異步操作的對象,它有三種狀態(tài):Pending、Fulfilled、Rejected,使用new Promise創(chuàng)建Promise對象,通過resolve和reject改變狀態(tài),then和catch方法用于處理成功和失敗的結果,本文介紹ES6 Promise用法,感興趣的朋友一起看看吧
    2024-09-09
  • 詳解js location.href和window.open的幾種用法和區(qū)別

    詳解js location.href和window.open的幾種用法和區(qū)別

    這篇文章主要介紹了詳解js location.href和window.open的幾種用法和區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • 原生JavaScript創(chuàng)建不可變對象的方法簡單示例

    原生JavaScript創(chuàng)建不可變對象的方法簡單示例

    這篇文章主要介紹了原生JavaScript創(chuàng)建不可變對象的方法,結合簡單實例形式分析了基于原生JavaScript創(chuàng)建不可變對象的相關原理、實現(xiàn)方法與操作注意事項,需要的朋友可以參考下
    2020-05-05

最新評論

周宁县| 陆河县| 定安县| 新巴尔虎左旗| 徐水县| 榕江县| 镇康县| 岑巩县| 都昌县| 阳城县| 西峡县| 土默特右旗| 横山县| 通榆县| 邢台市| 长顺县| 望谟县| 大石桥市| 秦皇岛市| 保靖县| 洞口县| 尼玛县| 霍林郭勒市| 彰武县| 三门县| 句容市| 肇源县| 黄冈市| 龙里县| 黔西县| 都江堰市| 凤翔县| 木里| 武夷山市| 漠河县| 潮安县| 抚顺市| 年辖:市辖区| 安陆市| 潼关县| 孟津县|