成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

jquery的上帝視角(promise)

Terry_Tai / 1951人閱讀

摘要:是一種異步編程規(guī)范音譯來理解普羅米修斯。普羅米修斯是希臘神話故事中的英雄,名字的意思是先知。最初的命名是未來,可見含義不是字面的誓言承諾之類,而是先知未來的意思。

promise 是一種異步編程規(guī)范,音譯來理解——“普羅米修斯”。普羅米修斯是希臘神話故事中的英雄,名字的意思是“先知”。Promise最初的命名是Futures, “未來”,可見Promise含義不是字面的“誓言”“承諾”之類,而是“先知”“未來”的意思。

promise的出現(xiàn)是為了解決 異步編程中最頭疼的事情 回調(diào)嵌套地域

動畫回調(diào)金字塔:

$("xx").animate({}, function(){
    //do something
    $("xx").animate({},function(){
        //do something
        $("xx").animate({},function(){
            //do something
            $("xx").animate({},function(){
                //do something
                $("xx").animate({},function(){
                    //do something
                },1000);
            },1000);
        },1000);
    },1000);
},1000);

看到這樣的代碼,其實強迫癥已經(jīng)犯了. 以上就是 從代碼的視角去看問題.

好了現(xiàn)在我們換個角度 去看這個問題. 切換到上帝視角

$("xx").animate({})
    //動畫1 之后
    .then(function(){
        return $("xx").animate({});
    })
    //動畫2 之后
    .then(function(){
        return  $("xx").animate({});
    })
    //動畫3 之后
    .then(function(){
        return  $("xx").animate({});
    })
    //動畫4 之后
    .then(function(){
        return  $("xx").animate({});
    })
    //動畫完成
    .done(function(){
        console.log("動畫完成...")
    })
    //動畫失敗
    .fail(function(){
        console.log("動畫出錯...")
    });

是不是非常 清晰流暢 這就是 同步編寫異步執(zhí)行 所帶來的魅力

這種模式被稱作promise模式 我們可以理解為
現(xiàn)實世界里,時間這條線就是單線程的,不會出現(xiàn)兩條時間線,這種事是會出現(xiàn)在科幻故事里. 如果我們的 人生 = 代碼
那么上帝已經(jīng)在他的時間維度的一瞬間規(guī)劃好了你的一生(因為他有先知的能力)(他無需跟著經(jīng)歷你的時間),雖然你自己依然感受到了時間,以及各種變數(shù)

更多詳細代碼哲學 請看這篇文章
http://www.zhangxinxu.com/wor...

現(xiàn)實中的例子 :
你求 別人辦事 別人給了你句答復20分鐘后 來拿結(jié)果 這個答復 就是 promise 在20分鐘內(nèi) 你可以去做別的事情 20分鐘后你拿這個promise 找到那個人 兌現(xiàn)承諾.

promise 就是未來的值

在jq中 提供的$.deferred對象 就是實現(xiàn)promise的解決方案.,defer的意思是"延遲",所以deferred對象的含義就是"延遲"到未來某個點再執(zhí)行。

deferred對象有三種執(zhí)行狀態(tài)

未完成(notify)

已完成(resolve)

已失敗(reject)

當deferred對象狀態(tài)發(fā)生變化 比如

變成resolve deferred對象立刻調(diào)用done()方法指定的回調(diào)函數(shù)

變成reject調(diào)用fail()方法指定的回調(diào)函數(shù);

變成 notify 則繼續(xù)等待,或者調(diào)用progress()方法指定的回調(diào)函數(shù)

這是不能直接 返回deferred對象 因為這個deferred對象 可以隨意被修改狀態(tài),因此我門需要返回一個 不能修改狀態(tài)的promise
deferred.promise() : 返回一個新的deferred對象,該對象的運行狀態(tài)無法被改變

所以我們的promise規(guī)范的模版

//創(chuàng)建
var  fnxx = function(){

    var defer = $.Deferred();

    //業(yè)務代碼....

    //條件
    if(xxxx)
        //成功
        defer.resolve(//成功返回值);
    else
        //失敗
        defer.reject(//失敗返回error);


    return defer.promise();
}


//調(diào)用
fnxx()
    .done(function(success){

    })
    .fail(function(error){
        
    });
業(yè)務案例

有如下需求

登錄獲得token

根據(jù)token查詢用戶信息

根據(jù)userId查詢用戶積分

根據(jù)積分判斷用戶是否需要充值

代碼如下 :


            //登錄獲得token
            login(userName,passWord)

                    //獲得用戶信息(根據(jù)token)
                    .then(function(loginUser){
                        return getUserInfo(loginUser.token);
                    })

                      //獲得積分(根據(jù)用戶id)
                    .then(function(userInfo){
                        return getCredit(userInfo.userId);
                    })

                    //是否需要充值
                    .then(function(credit){
                        return isRecharge(credit);
                    })
                     //最后結(jié)果
                    .done(function(isRe){
                        console.log(isRe);
                        if(isRe == 0){
                            alert("不需要充值!");
                        }
                        else if(isRe == 1){
                            alert("請充值");
                        }
                        else{
                            console.log("錯誤!");
                        }
                    })
                    //任意一步 出現(xiàn)錯誤
                    .fail(function(ob,name,error){
                        console.error(error.stack);
                    });

業(yè)務邏輯清晰自然 我們必須要學會 站在上帝視角 審視它們. 只有這樣才能輕松駕馭它們 成為Dominate

源代碼git https://github.com/sherlock22...

參考
http://www.ruanyifeng.com/blo...
http://www.zhangxinxu.com/wor...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/90129.html

相關(guān)文章

  • 終極蛇皮上帝視角之微信小程序之告別 setData

    摘要:而小程序官方的是在中調(diào)用方法來改變數(shù)據(jù),從而改變界面。為了寫測試讓咱們來重構(gòu)一把,利用學習過的函數(shù)式編程中的高階函數(shù)把依賴注入。也就是說當中的某個數(shù)據(jù)更新的時候,我們并不知道它會影響哪個中的屬性,特別的還有依賴于的情況。 眾所周知 Vue 是借助 ES5 的 Object.defineProperty 方法設(shè)置 getter、setter 達到數(shù)據(jù)驅(qū)動界面,當然其中還有模板編譯等等其他...

    wuyumin 評論0 收藏0
  • 終極蛇皮上帝視角之微信小程序之告別“刀耕火種”

    開門見山地說,小程序在日常開發(fā)中使用原生框架來開發(fā)還是挺不方便的,比如: 不支持 npm 包 不支持各種 CSS 預編譯器 不支持配置 Babel 來轉(zhuǎn)換一些 JavaScript 新特性 這樣一來和日常開發(fā)前端頁面的體驗相比來說,簡直就像在刀耕火種。 那么為了解決這些問題,我們能不能將前端開發(fā)中常用的 webpack 移植到小程序開發(fā)中呢? 當然可以! showImg(https://seg...

    TerryCai 評論0 收藏0
  • 阿里王剛談自動駕駛:從單車智能到車路協(xié)同智能進化

    摘要:在今年的云棲大會上,阿里巴巴人工智能實驗室除了發(fā)布服務機器人天貓精靈太空蛋太空梭天貓精靈車載版,還重點推出了車路協(xié)同智能自動駕駛車。秒看懂智慧物流車和感知基站各位嘉賓,上午好我是王剛,我要介紹的是自動駕駛從單車智能跨到協(xié)同智能的進化。 在今年的云棲大會上,阿里巴巴人工智能實驗室除了發(fā)布AliGenie 3.0、服務機器人(天貓精靈太空蛋、太空梭)、天貓精靈車載版(TmallGenie ...

    shery 評論0 收藏0
  • 阿里王剛談自動駕駛:從單車智能到車路協(xié)同智能進化

    摘要:在今年的云棲大會上,阿里巴巴人工智能實驗室除了發(fā)布服務機器人天貓精靈太空蛋太空梭天貓精靈車載版,還重點推出了車路協(xié)同智能自動駕駛車。秒看懂智慧物流車和感知基站各位嘉賓,上午好我是王剛,我要介紹的是自動駕駛從單車智能跨到協(xié)同智能的進化。 在今年的云棲大會上,阿里巴巴人工智能實驗室除了發(fā)布AliGenie 3.0、服務機器人(天貓精靈太空蛋、太空梭)、天貓精靈車載版(TmallGenie ...

    Dongjie_Liu 評論0 收藏0
  • JavaScript 異步

    摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。寫一個符合規(guī)范并可配合使用的寫一個符合規(guī)范并可配合使用的理解的工作原理采用回調(diào)函數(shù)來處理異步編程。 JavaScript怎么使用循環(huán)代替(異步)遞歸 問題描述 在開發(fā)過程中,遇到一個需求:在系統(tǒng)初始化時通過http獲取一個第三方服務器端的列表,第三方服務器提供了一個接口,可通過...

    tuniutech 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<