關鍵技術點:
作用域問題——回調函數中的作用域已經脫離了調用函數了,因此需要在回調函數外邊把this賦給一個新的變量才可以了。
業務需求:
微信小程序開發,業務邏輯需要,需要把獲取手機號碼的業務邏輯作為檢驗登錄有效性函數的回調函數。
異常描述:
微信小程序開發給data中的變量賦值,出現以下錯誤:
VM1610:1 thirdScriptError
Cannot read property 'setData' of undefined;at pages/index/index checkSession function;at api request success callback function
TypeError: Cannot read property 'setData' of undefined
at success (http://127.0.0.1:51323/appservice/pages/index/index.js:116:19)
at Function.function.a.(anonymous function) (http://127.0.0.1:51323/appservice/__dev__/WAService.js:7:8019)
at Object.success (http://127.0.0.1:51323/appservice/__dev__/WAService.js:4:13405)
......
詳細截圖:
異常代碼相關源碼:
1 Page({ 2 data: { 3 phone: "" 4 }, 5 ...... 6 /** 7 * 獲取用戶手機號碼 8 */ 9 getPhoneNumber: function(e) { 10 //checkSession(callback) 登錄有效性驗證函數,接收回調函數 11 //調用checkSession(callback) ,把getPhoneNumber的業務邏輯作為參數傳遞給驗證函數,以便checkSession(callback)在驗證登錄有效性之后做出相應的處理 12 this.checkSession(function() { 13 //用戶取消獲取手機號碼授權 14 if (e.detail.errMsg == "getPhoneNumber:fail user deny") return; 15 //用戶授權獲取手機號碼 16 var sessionKey = wx.getStorageSync("session_key") 17 //3. 解密手機號碼信息 18 var self=this 19 wx.request({ 20 url: 'http://xxxx.xxxxs.com/demo/demo.php', 21 data: { 22 'encryptedData': e.detail.encryptedData, 23 'iv': e.detail.iv, 24 'session_key': sessionKey 25 }, 26 method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT 27 header: { 28 'content-type': 'application/json' 29 }, // 設置請求的 header 30 success: function(data2) { 31 wx.hideLoading() 32 if (data2.statusCode == 200) { 33 //成功獲取手機號碼 34 if (data2.data.phoneNumber){ 35 wx.showToast({ 36 title: data2.data.phoneNumber 37 }) 38 self.setData({ //******出現異常的代碼部分********// 39 phone: '新消息' 40 }) 41 }else{ 42 console.log(data2.data) 43 } 44 } 45 }, 46 fail: function(err) { 47 console.log(err); 48 } 49 }) 50 }) 51 } 52 })
異常分析:
js文件中data的確有變量phone,一般來說,是不會出現錯誤異常的。既然出現了異常,那就應該是這部分代碼中有其他的一些代碼影響到了。
細細分析這部分代碼,除了把獲取手機號碼的業務邏輯作為 檢驗登錄有效性函數的回調函數之外,其他都是比較常用的代碼,所以問題很有可能就是回調函數的問題。
修改代碼,在調用sessionCheck()函數之前將this賦給新的變量self:
1 /** 2 * 獲取用戶手機號碼 3 */ 4 getPhoneNumber: function(e) { 5 //checkSession(callback) 登錄有效性驗證函數,接收回調函數 6 //調用checkSession(callback) ,把getPhoneNumber的業務邏輯作為參數傳遞給驗證函數,以便checkSession(callback)在驗證登錄有效性之后做出相應的處理 7 var self = this 8 self.checkSession(function() { 9 ......
驗證結果:
問題解決,代碼運行正常!
個人原創博客,轉載請注明來源地址:https://www.cnblogs.com/xyyt/p/9584575.html