最近開發小程序,發現爆的最多的錯就是各種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=>{} )}
其它更多參數設置:
三、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); })
