微信小程序:使用Promise簡化回調(diào)

封面

了解什么是 Promise 對象

在項目中彭羹,會出現(xiàn)各種異步操作田晚,如果一個異步操作的回調(diào)里還有異步操作抡句,就會出現(xiàn)回調(diào)金字塔。

比如下面這種

// 模擬獲取code仪壮,然后將code傳給后臺裕膀,成功后獲取userinfo胞四,再將userinfo傳給后臺
// 登錄
wx.login({
    success: res => {
        let code = res.code
        // 請求
        imitationPost({
            url: '/test/loginWithCode',
            data: {
                code
            },
            success: data => {
                // 獲取userInfo
                wx.getUserInfo({
                    success: res => {
                        let userInfo = res.userInfo
                        // 請求
                        imitationPost({
                            url: '/test/saveUserInfo',
                            data: {
                                userInfo
                            },
                            success: data => {
                                console.log(data)
                            },
                            fail: res => {
                                console.log(res)
                            }
                        })
                    },
                    fail: res => {
                        console.log(res)
                    }
                })
            },
            fail: res => {
                console.log(res)
            }
        })
    },
    fail: res => {
        console.log(res)
    }
})

下面分析如何用Promise來進行簡化代碼

因為微信小程序異步api都是success和fail的形式井赌,所有有人封裝了這樣一個方法:

promisify.js

module.exports = (api) => {
    return (options, ...params) => {
        return new Promise((resolve, reject) => {
            api(Object.assign({}, options, { success: resolve, fail: reject }), ...params);
        });
    }
}

先看最簡單的:

// 獲取系統(tǒng)信息
wx.getSystemInfo({
    success: res => {
        // success
        console.log(res)
    },
    fail: res => {

    }
})

使用上面的promisify.js簡化后:

const promisify = require('./promisify')
const getSystemInfo = promisify(wx.getSystemInfo)

getSystemInfo().then(res=>{
    // success
    console.log(res)
}).catch(res=>{

})
getSystemInfo

可以看到簡化后的回調(diào)里少了一個縮進,并且回調(diào)函數(shù)從9行減少到了6行舟铜。

回調(diào)金字塔的簡化效果

那么再來看看最開始的那個回調(diào)金字塔

const promisify = require('./promisify')
const login = promisify(wx.login)
const getSystemInfo = promisify(wx.getSystemInfo)

// 登錄
login().then(res => {
    let code = res.code
    // 請求
    pImitationPost({
        url: '/test/loginWithCode',
        data: {
            code
        },
    }).then(data => {
        // 獲取userInfo
        getUserInfo().then(res => {
            let userInfo = res.userInfo
            // 請求
            pImitationPost({
                url: '/test/saveUserInfo',
                data: {
                    userInfo
                },
            }).then(data => {
                console.log(data)
            }).catch(res => {
                console.log(res)
            })
        }).catch(res => {
            console.log(res)
        })
    }).catch(res => {
        console.log(res)
    })
}).catch(res => {
    console.log(res)
})
簡化回調(diào)

可以看到簡化效果非常明顯戈盈。

同樣適用于網(wǎng)頁或者nodejs等中。

參考

源代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谆刨,一起剝皮案震驚了整個濱河市塘娶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痊夭,老刑警劉巖刁岸,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異生兆,居然都是意外死亡难捌,警方通過查閱死者的電腦和手機膝宁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門鸦难,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人员淫,你說我怎么就攤上這事合蔽。” “怎么了介返?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵拴事,是天一觀的道長沃斤。 經(jīng)常有香客問我,道長刃宵,這世上最難降的妖魔是什么衡瓶? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮牲证,結(jié)果婚禮上哮针,老公的妹妹穿的比我還像新娘。我一直安慰自己坦袍,他們只是感情好十厢,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捂齐,像睡著了一般蛮放。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奠宜,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天包颁,我揣著相機與錄音,去河邊找鬼压真。 笑死徘六,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的榴都。 我是一名探鬼主播待锈,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嘴高!你這毒婦竟也來了竿音?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤拴驮,失蹤者是張志新(化名)和其女友劉穎春瞬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體套啤,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡宽气,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了潜沦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萄涯。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖唆鸡,靈堂內(nèi)的尸體忽然破棺而出涝影,到底是詐尸還是另有隱情,我是刑警寧澤争占,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布燃逻,位于F島的核電站序目,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏伯襟。R本人自食惡果不足惜猿涨,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望姆怪。 院中可真熱鬧嘿辟,春花似錦、人聲如沸片效。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淀衣。三九已至昙读,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間膨桥,已是汗流浹背蛮浑。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留只嚣,地道東北人沮稚。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像册舞,于是被迫代替她去往敵國和親蕴掏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持调鲸,譯者再次奉上一點點福利:阿里云產(chǎn)品券盛杰,享受所有官網(wǎng)優(yōu)惠,并抽取幸運大...
    HetfieldJoe閱讀 8,677評論 0 29
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持藐石,譯者再次奉上一點點福利:阿里云產(chǎn)品券即供,享受所有官網(wǎng)優(yōu)惠,并抽取幸運大...
    HetfieldJoe閱讀 11,025評論 26 95
  • 本文作者就是我于微,簡書的microkof逗嫡。如果您覺得本文對您的工作有意義,產(chǎn)生了不可估量的價值株依,那么請您不吝打賞我驱证,...
    microkof閱讀 15,946評論 9 40
  • Promise 對象 Promise 的含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,702評論 1 56
  • 夜靜的只剩下蟲鳴勺三, 香煙只與那心情有關(guān)雷滚。 夜風吹動了蓬蒿需曾, 卻撼不動那屹然的大樹吗坚, 而蓬蒿自知祈远, 唯有堅強的樹心才...
    HS深山冷月閱讀 193評論 0 2