微信小程式使用Promise簡化回調,promise回調

來源:互聯網
上載者:User

小程式使用Promise簡化回調,promise回調

Promise 是非同步編程的一種解決方案,比傳統的解決方案——回呼函數和事件——更合理和更強大。它由社區最早提出和實現,ES6 將其寫進了語言標準,統一了用法,原生提供了Promise對象。

所謂Promise,簡單說就是一個容器,裡面儲存著某個未來才會結束的事件(通常是一個非同步作業)的結果。從文法上說,Promise 是一個對象,從它可以擷取非同步作業的訊息。Promise 提供統一的 API,各種非同步作業都可以用同樣的方法進行處理。

瞭解什麼是 Promise 對象

在項目中,會出現各種非同步作業,如果一個非同步作業的回調裡還有非同步作業,就會出現回調金字塔。

比如下面這種

// 類比擷取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);    });  }}

先看最簡單的:

// 擷取系統資訊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

可以看到簡化後的回調裡少了一個縮排,並且回呼函數從9行減少到了6行。

回調金字塔的簡化效果

那麼再來看看最開始的那個回調金字塔

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)})

簡化回調

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

同樣適用於網頁或者nodejs等中。

參考

Promise 對象

原始碼

tomfriwel/MyWechatAppDemo 的promisePage頁面

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.