關於小程序undefined遇到的各種坑


    最近開發小程序,發現爆的最多的錯就是各種undefined

      這里整理了遇到各種undefined的解決思路:

      

      苦茶在進行微信小程序頁面跳轉時,進行了傳遞參數,而頁面傳遞參數的時候,像數字、字符串之類的可以直接傳遞,對象和數組需要用JSON.stringify()轉成字符串再進行傳遞。然后在跳轉頁面的onLoad函數中用JSON.parse()轉成原型再使用。

 

但是當后台返回為 空 或者 undefined 的時候,這時候傳遞過去的就是undefined
在這里插入圖片描述
在這里插入圖片描述
這個時候 JSON.parse() 就會報錯:
在這里插入圖片描述
在這里插入圖片描述
這個時候一般都是會先判斷一下,是否為undefined然后確定是否 JSON.parse() ,這里就到了很坑的時候了,如果你直接這樣寫:

 

onLoad: function (options) { console.log(options.informList); //undefined if(options.informList !== undefined ){ console.log(222); var test = JSON.parse(options.informList); console.log(test); this.setData({ testlist: test, num:test.length }) console.log(this.data.num); }else{ console.log(111); this.setData({ num:0 }) } }, 

 

 

 

這樣運行的結果會非常的匪夷所思,這時候打印一下 options.informList 的類型就恍然大悟了,原來傳遞過來的時候被轉換為String類型了,所以這里的undefined就不是undefined了!

 

解決辦法:

 

onLoad: function (options) { console.log(options.informList); console.log(typeof(options.informList)); if(options.informList !== "undefined" ){ console.log(222) var test = JSON.parse(options.informList); console.log(test); this.setData({ testlist: test, num:test.length }) console.log(this.data.num); }else{ this.setData({ num:0 }) } }, 

 

 

二、解決微信小程序每次request請求,Cookie不一樣

 

這次做微信小程序,發現和后台建立連接,每次都會新建一個連接,這樣就無法在同一個連接上進行操作,那么后台中的數據,后台就無法通過緩存進行傳輸,所以必須得解決這個問題。

 

解決辦法:

 

//保存cookies,解決request每次請求連接不一樣的bug const phpsessidarr = result.cookies[0].split(";"); //這里result是后台第一返回的,可以從中獲取到cookies const phpsessid = phpsessidarr[0]; const header = {'content-type': 'application/json', 'Cookie': phpsessid}; wx.request({ url: common_urlapi+url, data:{}, header: header, method:"POST", success:res=>{}, fail:err=>{} )}

 

其它更多參數設置:

 

Header:請求頭參數詳解

 

三、request 獲取不到返回值

 

有時候直接調用 request ,然后直接令變量等於 success 里面的返回值,但是發現根本獲取不到

 

function request_urlapi_fun(url,token,date,obj){ const app = getApp(); const common_urlapi = app.globalData.urlapi; const cookies=wx.getStorageSync('cookies'); const objString = JSON.stringify(obj); const phpsessidarr = cookies.split(";"); const phpsessid = phpsessidarr[0]; console.log(phpsessid); const header = {'content-type': 'application/json', 'Cookie': wx.getStorageSync('phpsessid')}; const token2 = md5.md5(token+objString); wx.request({ url: common_urlapi+url, data:{ token:token2, time:parseInt(date), ac_id:obj.ac_id, }, header: header, method:"POST", success:res=> { console.log(res); console.log(res.data); return res }, fail:err=>{ console.log(err); wx.showModal({ title: '提示', content: '服務器錯誤', }); } }) }

 

結果發現外面根本無法獲取到

 

let a = request_urlapi_fun.request_urlapi_fun("Academy/notice",token,date,obj); console.log(a);

 

 

運行結果:
在這里插入圖片描述
大家會發現,代碼是先打印a,再執行的 request_urlapi_fun ,所以導致根本無法獲取值,菜鳥感覺是request是異步請求的原因!

 

解決辦法也很簡單,就是將異步變為同步就好了

 

function request_urlapi_fun(url,token,date,obj){ const app = getApp(); const common_urlapi = app.globalData.urlapi; const cookies=wx.getStorageSync('cookies'); const objString = JSON.stringify(obj); const phpsessidarr = cookies.split(";"); const phpsessid = phpsessidarr[0]; console.log(phpsessid); const header = {'content-type': 'application/json', 'Cookie': wx.getStorageSync('phpsessid')}; const token2 = md5.md5(token+objString); return new Promise((resolve ,reject)=>{ wx.request({ url: common_urlapi+url, data:{ token:token2, time:parseInt(date), ac_id:obj.ac_id, }, header: header, method:"POST", success:res=> { console.log(res); console.log(res.data); console.log(token); wx.setStorageSync('pbw_token', res.data.datas.token); delete res.data.datas.token; console.log(wx.getStorageSync('pbw_token')); let mdtoken = md5.md5(token+JSON.stringify(res.data.datas)); console.log(mdtoken); if(mdtoken === wx.getStorageSync('pbw_token')){ resolve(res); }else{ wx.showModal({ title: '提示', content: '數據被篡改', }); } }, fail:err=>{ reject(err); console.log(err); wx.showModal({ title: '提示', content: '服務器錯誤', }); } }) }) }

 

然后返回的的值是promise類型,所以要調用其結果,應該這樣:

 

a.then(res=>{ console.log(res); this.setData({ 'informList[0].num':res.data.datas.schoolinform.length, 'informList[1].num':res.data.datas.academyinform.length, schoolinform:res.data.datas.schoolinform, academyinform:res.data.datas.academyinform, }) }).catch(err=>{ console.log(err); })

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM