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

資訊專(zhuān)欄INFORMATION COLUMN

Promise初探

mj / 1487人閱讀

摘要:可以根據(jù)省份城市和區(qū)對(duì)組件設(shè)置默認(rèn)值。獲取省份獲取城市獲取區(qū)出現(xiàn)層嵌套的回調(diào),這就是傳說(shuō)中的惡魔金字塔。相比回調(diào)嵌套,層次更分明,可讀性強(qiáng)。基本原理學(xué)習(xí)無(wú)論是在異步操作的執(zhí)行之前或執(zhí)行之后,用對(duì)象的方法注冊(cè)回調(diào),回調(diào)都能一致執(zhí)行。

遭遇“惡魔金字塔”

項(xiàng)目需要,封裝了一個(gè)省市區(qū)的地址選擇器組件。

可以根據(jù)省份id、城市id和區(qū)id對(duì)組件設(shè)置默認(rèn)值。邏輯是這樣的:

獲取省份列表,選中默認(rèn)省份;

第一步成功后,根據(jù)默認(rèn)省份id獲取城市列表,選中默認(rèn)城市;

第二部成功后,根據(jù)默認(rèn)城市id獲取區(qū)列表,選中默認(rèn)區(qū)。

 getDefaultOptions = () = >{
    let {
        province: provinceId,
        city: cityId
    } = this.props.defaultValue;
        
    //獲取省份
    this.props.dispatch({
        type: "basic/getProvinceList",
        params: {},
        successCallBack: (rs) = >{
            let provinceList = rs.provinces;

            //獲取城市
            let params = {
                province_id: +provinceId
            };
            this.props.dispatch({
                type: "storage/getCityList",
                params,
                successCallBack: (rs2) = >{
                    let cityList = rs2.cities;
                    if (cityList == null) {
                        cityList = [];
                    }

                    if ( + cityId == 0) {
                        this._getOptions(provinceList, [], []);
                        return;
                    }
                    //獲取區(qū)
                    let params = {
                        city_id: +cityId,
                    };
                    this.props.dispatch({
                        type: "storage/getDistrictList",
                        params,
                        successCallBack:  (rs3) = >{
                            let districtList = rs3.districts;
                            if (districtList == null) {
                                districtList = [];
                            }
                            this._getOptions(provinceList, cityList, districtList);
                    };
                    });

                }
            });

        }
    });
 };

出現(xiàn)3層嵌套的回調(diào),這就是傳說(shuō)中的“惡魔金字塔”。確實(shí)是惡魔呀,可讀性巨差,自己看著都有點(diǎn)暈,更別說(shuō)其他人了。

都說(shuō)ES6的Promise對(duì)象讓“惡魔金字塔”聞風(fēng)喪膽,忍不住來(lái)體驗(yàn)一下。

Promise登場(chǎng)

MDN上這樣定義Promise:
The Promise object represents the eventual completion (or failure) of an asynchronous operation, and its resulting value.

廢話(huà)不多說(shuō),來(lái)看看使用了Promise后的代碼是怎樣的:

sendRequest = (type, params) = >{
    return new Promise((resolve, reject) = >{
        this.props.dispatch({
            type,
            params,
            successCallBack: (rs) = >{
                resolve(rs);
            }
        });
    });
};

getDefaultOptions = () = >{
    let {
        province: provinceId,
        city: cityId
    } = this.props.defaultValue;
    let provinceList,
    cityList,
    districtList;
    let _promise = this.sendRequest("basic/getProvinceList", {});
    _promise.then(rs = >{
        provinceList = rs.provinces ? rs.provinces: [];
        return this.sendRequest("storage/getCityList", {
            province_id: +provinceId
        })
    }).then(rs = >{
        cityList = rs.cities ? rs.cities: [];
        //只有省份的情況
        if ( + cityId == 0) {
            this._getOptions(provinceList, cityList, []);
            return Promise.reject({
                notRealPromiseException: true,
            });
        }
        return this.sendRequest("storage/getDistrictList", {
            city_id: +cityId
        });
    }).then(rs = >{
        districtList = rs.districts ? rs.districts: [];
        return this._getOptions(provinceList, cityList, districtList);
    }).
    catch(ex = >{
        if (ex.notRealPromiseException) {
            return true;
        }
        return false;
    });
};

需要有序地執(zhí)行異步操作的場(chǎng)景,Promise再適合不過(guò)了。相比回調(diào)嵌套,層次更分明,可讀性強(qiáng)。

Promise基本原理學(xué)習(xí)

無(wú)論是在異步操作的執(zhí)行之前或執(zhí)行之后,用Promise對(duì)象的then方法注冊(cè)回調(diào),回調(diào)都能一致執(zhí)行。

很好奇它是怎么做到的,于是自己嘗試寫(xiě)了個(gè)簡(jiǎn)易的Promise, 模擬Promise對(duì)異步操作的值的代理:
https://gist.github.com/anony...

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

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

相關(guān)文章

  • 初探 es6 promise

    摘要:是單線(xiàn)程程序,所有代碼都是單線(xiàn)程執(zhí)行。導(dǎo)致的網(wǎng)絡(luò)請(qǐng)求都是異步執(zhí)行,異步執(zhí)行可以通過(guò)回調(diào)函數(shù)實(shí)現(xiàn)秒鐘才能打印,回調(diào)函數(shù)處理異步執(zhí)行的但是推出一種新的方法對(duì)象用于表示一個(gè)異步操作的最終狀態(tài)完成或失敗,以及其返回的值。 javascript是單線(xiàn)程程序,所有代碼都是單線(xiàn)程執(zhí)行。導(dǎo)致javascript的網(wǎng)絡(luò)請(qǐng)求都是異步執(zhí)行,異步執(zhí)行可以通過(guò)回調(diào)函數(shù)實(shí)現(xiàn): setTimeout(callbac...

    paraller 評(píng)論0 收藏0
  • Callback到Promise再到Async進(jìn)化初探

    摘要:題外今天嘗試了一下從文件經(jīng)過(guò)再到文件的整個(gè)過(guò)程,這也是這種靜態(tài)博客生成過(guò)程中的一環(huán)。這過(guò)程中,用到的中的系統(tǒng),寫(xiě)的過(guò)程中恰好也經(jīng)歷了從到再到的轉(zhuǎn)變??梢钥吹缴厦娴暮瘮?shù)已經(jīng)非常順序化了,當(dāng)有個(gè)異步函數(shù)回調(diào)時(shí),只需要順序?qū)懢涂梢岳病? 題外:今天嘗試了一下從Markdown文件經(jīng)過(guò)ejs再到html文件的整個(gè)過(guò)程,這也是Hexo這種靜態(tài)博客生成過(guò)程中的一環(huán)。這過(guò)程中,用到的Node中的fs系...

    legendmohe 評(píng)論0 收藏0
  • Mocha測(cè)試初探

    摘要:是測(cè)試用例,表示一個(gè)單獨(dú)的測(cè)試,是測(cè)試的最小單位。第一個(gè)參數(shù)是測(cè)試用例的名稱(chēng)加應(yīng)該等于,第二個(gè)參數(shù)是一個(gè)實(shí)際執(zhí)行的函數(shù)。這里對(duì)異步代碼進(jìn)行測(cè)試時(shí)需要注意一點(diǎn),默認(rèn)一個(gè)單元測(cè)試最多執(zhí)行超時(shí)會(huì)報(bào)錯(cuò)。 Mocha簡(jiǎn)介: 一個(gè)具有豐富特性的javascript 測(cè)試框架,支持多種斷言庫(kù),異步代碼測(cè)試等,不僅可運(yùn)行在node.js 環(huán)境中還可以運(yùn)行在瀏覽器中。 一、安裝 // 全局安裝 npm ...

    Binguner 評(píng)論0 收藏0
  • Puppeteer初探--爬取并生成《ES6標(biāo)準(zhǔn)入門(mén)》PDF

    摘要:首先介紹是一個(gè)庫(kù),他提供了一組用來(lái)操縱的默認(rèn)也就是無(wú)的,也可以配置為有有點(diǎn)類(lèi)似于,但是官方團(tuán)隊(duì)進(jìn)行維護(hù)的,前景更好。使用,相當(dāng)于同時(shí)具有和的能力,應(yīng)用場(chǎng)景會(huì)非常多。 首先介紹Puppeteer Puppeteer是一個(gè)node庫(kù),他提供了一組用來(lái)操縱Chrome的API(默認(rèn)headless也就是無(wú)UI的chrome,也可以配置為有UI) 有點(diǎn)類(lèi)似于PhantomJS,但Puppet...

    JerryWangSAP 評(píng)論0 收藏0
  • 構(gòu)建 Web 應(yīng)用之 Service Worker 初探

    摘要:誕生之初,是單線(xiàn)程的。當(dāng)接收到服務(wù)端的響應(yīng)之后,便通過(guò)回調(diào)函數(shù)執(zhí)行之后的操作。沖鋒基于事件驅(qū)動(dòng)。擁有攔截請(qǐng)求消息推送靜默更新地理圍欄等服務(wù)??刂茣r(shí)處于兩種狀態(tài)之一終止以節(jié)省內(nèi)存監(jiān)聽(tīng)獲取和消息事件。支持的所有事件五銷(xiāo)毀瀏覽器決定是否銷(xiāo)毀。 這次體驗(yàn)一種新的博客風(fēng)格,我們長(zhǎng)話(huà)短說(shuō),針針見(jiàn)血。 showImg(https://segmentfault.com/img/remote/14600...

    voidking 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

mj

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<