微信小程序開發——使用回調函數出現異常:TypeError: Cannot read property 'setData' of undefined


關鍵技術點:

作用域問題——回調函數中的作用域已經脫離了調用函數了,因此需要在回調函數外邊把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


免責聲明!

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



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