微信小程序異步請求問題

微信小程序爲了提升用戶體驗,提供的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

相關文章
相關標籤/搜索