国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Promise初探

mj / 1484人閱讀

摘要:可以根據省份城市和區對組件設置默認值。獲取省份獲取城市獲取區出現層嵌套的回調,這就是傳說中的惡魔金字塔。相比回調嵌套,層次更分明,可讀性強。基本原理學習無論是在異步操作的執行之前或執行之后,用對象的方法注冊回調,回調都能一致執行。

遭遇“惡魔金字塔”

項目需要,封裝了一個省市區的地址選擇器組件。

可以根據省份id、城市id和區id對組件設置默認值。邏輯是這樣的:

獲取省份列表,選中默認省份;

第一步成功后,根據默認省份id獲取城市列表,選中默認城市;

第二部成功后,根據默認城市id獲取區列表,選中默認區。

 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;
                    }
                    //獲取區
                    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);
                    };
                    });

                }
            });

        }
    });
 };

出現3層嵌套的回調,這就是傳說中的“惡魔金字塔”。確實是惡魔呀,可讀性巨差,自己看著都有點暈,更別說其他人了。

都說ES6的Promise對象讓“惡魔金字塔”聞風喪膽,忍不住來體驗一下。

Promise登場

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

廢話不多說,來看看使用了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;
    });
};

需要有序地執行異步操作的場景,Promise再適合不過了。相比回調嵌套,層次更分明,可讀性強。

Promise基本原理學習

無論是在異步操作的執行之前或執行之后,用Promise對象的then方法注冊回調,回調都能一致執行。

很好奇它是怎么做到的,于是自己嘗試寫了個簡易的Promise, 模擬Promise對異步操作的值的代理:
https://gist.github.com/anony...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/91857.html

相關文章

  • 初探 es6 promise

    摘要:是單線程程序,所有代碼都是單線程執行。導致的網絡請求都是異步執行,異步執行可以通過回調函數實現秒鐘才能打印,回調函數處理異步執行的但是推出一種新的方法對象用于表示一個異步操作的最終狀態完成或失敗,以及其返回的值。 javascript是單線程程序,所有代碼都是單線程執行。導致javascript的網絡請求都是異步執行,異步執行可以通過回調函數實現: setTimeout(callbac...

    paraller 評論0 收藏0
  • Callback到Promise再到Async進化初探

    摘要:題外今天嘗試了一下從文件經過再到文件的整個過程,這也是這種靜態博客生成過程中的一環。這過程中,用到的中的系統,寫的過程中恰好也經歷了從到再到的轉變。可以看到上面的函數已經非常順序化了,當有個異步函數回調時,只需要順序寫就可以啦。 題外:今天嘗試了一下從Markdown文件經過ejs再到html文件的整個過程,這也是Hexo這種靜態博客生成過程中的一環。這過程中,用到的Node中的fs系...

    legendmohe 評論0 收藏0
  • Mocha測試初探

    摘要:是測試用例,表示一個單獨的測試,是測試的最小單位。第一個參數是測試用例的名稱加應該等于,第二個參數是一個實際執行的函數。這里對異步代碼進行測試時需要注意一點,默認一個單元測試最多執行超時會報錯。 Mocha簡介: 一個具有豐富特性的javascript 測試框架,支持多種斷言庫,異步代碼測試等,不僅可運行在node.js 環境中還可以運行在瀏覽器中。 一、安裝 // 全局安裝 npm ...

    Binguner 評論0 收藏0
  • Puppeteer初探--爬取并生成《ES6標準入門》PDF

    摘要:首先介紹是一個庫,他提供了一組用來操縱的默認也就是無的,也可以配置為有有點類似于,但是官方團隊進行維護的,前景更好。使用,相當于同時具有和的能力,應用場景會非常多。 首先介紹Puppeteer Puppeteer是一個node庫,他提供了一組用來操縱Chrome的API(默認headless也就是無UI的chrome,也可以配置為有UI) 有點類似于PhantomJS,但Puppet...

    JerryWangSAP 評論0 收藏0
  • 構建 Web 應用之 Service Worker 初探

    摘要:誕生之初,是單線程的。當接收到服務端的響應之后,便通過回調函數執行之后的操作。沖鋒基于事件驅動。擁有攔截請求消息推送靜默更新地理圍欄等服務。控制時處于兩種狀態之一終止以節省內存監聽獲取和消息事件。支持的所有事件五銷毀瀏覽器決定是否銷毀。 這次體驗一種新的博客風格,我們長話短說,針針見血。 showImg(https://segmentfault.com/img/remote/14600...

    voidking 評論0 收藏0

發表評論

0條評論

mj

|高級講師

TA的文章

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