微信小程序爲了提升用戶體驗,提供的api大部分都是異步操做,除了數據緩存操做裏面有一些同步操做。是提升了用戶體驗,可是在開發的時候,javascript
就有點坑了,例如我要寫一個公共方法,發起網絡請求,去後臺去一些數據,成功以後,再作一些操做,可是因爲wx.request是異步請求,就會html
致使,網絡請求還沒結束,就會執行後面的代碼,從而引發異常,怎麼解決這種異步致使的問題呢,固然是promise了。看例子:java
公共common.js裏封裝了一個獲得用戶實體的方法:小程序
//發起請求,獲得用戶實體 function GetUserEntity() { wx.request({ url: http_config.getUserDetail, data: { Sha1OpenId: wx.getStorageSync('LoginSessionKey') }, success: (res) => { let result = res.data.data; console.log(result) return result; }, fail: () => { return "系統異常,請重試!" } }) } module.exports.GetUserEntity = GetUserEntity
而後在另外一個js中調用這個方法,獲得用戶實體成功以後,在進行一系列操做:微信小程序
const com = require(`${root_path}/utils/common.js`) //在方法中進行一下操做 let userEntity = com.GetUserEntity(); console.log(userEntity.Sex) console.log("獲得實體以後進行的操做")
執行以後會發現,程序報錯api
明明實體用有Sex這個屬性,爲何報錯,這就是異步請求形成的問題,請求還沒返回值,下面的代碼已經執行了。promise
解決辦法:利用promise緩存
網絡請求改爲:微信
function GetUserEntity() { return new Promise(function (resolve, reject) { wx.request({ url: http_config.getUserDetail, data: { Sha1OpenId: wx.getStorageSync('LoginSessionKey') }, success: (res) => { let result = res.data.data; resolve(result) ; }, fail:()=>{ reject("系統異常,請重試!") } }) }) }
請求方法改爲:網絡
comm.GetUserEntity().then((res) => { console.log(res) }).catch((res) => { console.log(res) })
簡單記憶:resolve 返回,以後代碼走then,reject返回,那麼代碼就會走catch。
咱們能夠把執行GetUserEntity方法以後要執行的代碼放在then中,若是GetUserEntity中發起的請求出錯那麼程序就會經過reject返回信息,
那麼咱們能夠再catch中作相應的處理。
參考:https://www.cnblogs.com/zhihuama/articles/9143954.html
https://blog.csdn.net/qq_32786873/article/details/72179601