国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 熱點 > 微信 > 正文

詳解在微信小程序的JS腳本中使用Promise來優化函數處理

2024-07-22 01:18:59
字體:
來源:轉載
供稿:網友

在我們傳統的Javascript開發函數編寫中,我們習慣了回調函數的處理,不過隨著回調函數的增多,以及異步處理的復雜性等原因,代碼越來越難讀,因此誕生了使用Promise來優化JS函數處理的需求,引入Promise確實能夠很好的解決異步回調函數的可讀性等問題,同時也使得我們調用的時候代碼簡潔一些,本文介紹如何在小程序的JS代碼里面使用Promise來封裝一些函數的做法。

1、小程序傳統的回調處理

例如我們生成一個小程序,里面的app.js里面就自動帶有一個getUserInfo的函數,這個是使用傳統模式的回調函數。

//app.jsApp({ onLaunch: function () { //調用API從本地緩存中獲取數據 var logs = wx.getStorageSync('logs') || [] logs.unshift(Date.now()) wx.setStorageSync('logs', logs) },  getUserInfo:function(cb){ var that = this if(this.globalData.userInfo){  typeof cb == "function" && cb(this.globalData.userInfo) }else{  //調用登錄接口  wx.login({  success: function () {   wx.getUserInfo({   success: function (res) {    that.globalData.userInfo = res.userInfo    typeof cb == "function" && cb(that.globalData.userInfo)   }   })  }  }) } }, globalData:{ userInfo: null, openid: null }})

這種是通過 傳入一個cb的回調函數進行處理,使用的時候為了安全性,還需要進一步判斷其類型是否為函數:typeof cb == "function",這種處理還是相對比較易懂。

但是,如果我們一段代碼中,異步操作太多,又要保證這些異步操作是有順序的執行,那我們的代碼就看起來非常糟糕,就像這樣的極端情況:

asyncFunc1(function(){ //... asyncFunc2(function(){ //... asyncFunc3(function(){  //...  asyncFunc4(function(){  //...  asyncFunc5(function(){   //...  });  }); }); });});

如果我們改用Promise來處理,那么進行一層簡單的包裝即可。

function asyncFunc1(){ return new Promise(function (resolve, reject) { //... })}

2、Promise的使用介紹

Promise的使用相對比較簡單,我們入門可以參考下相關介紹:阮一峰 promise入門,如果我們在JS函數里面引入它的話,那么需要包含對應的javascript組件

我們可以在Github上下載對應的組件JS,引入小程序項目即可:es6-promise

我們為了方便,在項目中創建一個輔助類utils.js,然后在其中引入Promise的腳本,如下所示。

const Promise = require('./Promise')

然后在APP.js里面,我們修改原來的getUserInfo函數如下 

//app.jsconst utils = require('./utils/util.js')App({ onLaunch: function() {  //調用API從本地緩存中獲取數據  var logs = wx.getStorageSync('logs') || []  logs.unshift(Date.now())  wx.setStorageSync('logs', logs) }, getUserInfo() {  return new utils.Promise((resolve, reject) => {   if (this.globalData.userInfo) {    resolve(this.globalData.userInfo)   }   return utils.getUserInfo().then(res => {    resolve(this.globalData.userInfo = res.userInfo)   })  }) }, //獲取系統信息 getSystemInfo() {  return new utils.Promise((resolve, reject) => {   var that = this   if (that.globalData.systemInfo) {    resolve(that.globalData.systemInfo)   } else {    wx.getSystemInfo({     success: function(res) {      resolve(that.globalData.systemInfo = res);     }    })   }  }) }, //全局對象 globalData: {  userInfo: null,  systemInfo: null }, utils})            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 额尔古纳市| 龙泉市| 阜康市| 满洲里市| 乌什县| 罗江县| 朝阳市| 武义县| 合肥市| 贵溪市| 崇阳县| 合水县| 保山市| 金堂县| 盐城市| 通化市| 潮安县| 金湖县| 桃江县| 凤山县| 东明县| 沾益县| 大英县| 苍梧县| 宜兰县| 峡江县| 宁安市| 忻州市| 清水河县| 汪清县| 综艺| 谢通门县| 比如县| 湖南省| 新民市| 陇川县| 榆树市| 文成县| 金川县| 云龙县| 文安县|