关键技术点:

作用域问题——回调函数中的作用域已经脱离了调用函数了,因此需要在回调函数外边把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)
......

详细截图:

异常代码相关源码:

 Page({
data: {
phone: ""
},
  ......
/**
* 获取用户手机号码
*/
getPhoneNumber: function(e) {
//checkSession(callback) 登录有效性验证函数,接收回调函数
//调用checkSession(callback) ,把getPhoneNumber的业务逻辑作为参数传递给验证函数,以便checkSession(callback)在验证登录有效性之后做出相应的处理
this.checkSession(function() {
//用户取消获取手机号码授权
if (e.detail.errMsg == "getPhoneNumber:fail user deny") return;
//用户授权获取手机号码
var sessionKey = wx.getStorageSync("session_key")
//3. 解密手机号码信息
var self=this
wx.request({
url: 'http://xxxx.xxxxs.com/demo/demo.php',
data: {
'encryptedData': e.detail.encryptedData,
'iv': e.detail.iv,
'session_key': sessionKey
},
method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
header: {
'content-type': 'application/json'
}, // 设置请求的 header
success: function(data2) {
wx.hideLoading()
if (data2.statusCode == 200) {
//成功获取手机号码
if (data2.data.phoneNumber){
wx.showToast({
title: data2.data.phoneNumber
})
self.setData({ //******出现异常的代码部分********//
phone: '新消息'
})
}else{
console.log(data2.data)
}
}
},
fail: function(err) {
console.log(err);
}
})
})
}
})

异常分析:

js文件中data的确有变量phone,一般来说,是不会出现错误异常的。既然出现了异常,那就应该是这部分代码中有其他的一些代码影响到了。

细细分析这部分代码,除了把获取手机号码的业务逻辑作为 检验登录有效性函数的回调函数之外,其他都是比较常用的代码,所以问题很有可能就是回调函数的问题。

修改代码,在调用sessionCheck()函数之前将this赋给新的变量self:

   /**
* 获取用户手机号码
*/
getPhoneNumber: function(e) {
//checkSession(callback) 登录有效性验证函数,接收回调函数
//调用checkSession(callback) ,把getPhoneNumber的业务逻辑作为参数传递给验证函数,以便checkSession(callback)在验证登录有效性之后做出相应的处理
var self = this
self.checkSession(function() {
  ......

验证结果:

问题解决,代码运行正常!

个人原创博客,转载请注明来源地址:https://www.cnblogs.com/xyyt/p/9584575.html

微信小程序开发——使用回调函数出现异常:TypeError: Cannot read property 'setData' of undefined的更多相关文章

  1. 微信小程序开发 -- 通过云函数下载任意文件

    微信小程序开发 -- 通过云函数下载任意文件 1.云开发介绍 ​ 微信小程序开发者众所周知,小程序开发拥有许多限制,当我还是一个菜鸟入门的时候,第一关就卡在了没有备案域名的HTTP请求上面,那时候云开 ...

  2. 【微信小程序开发•系列文章六】生命周期和路由

    这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...

  3. 微信小程序开发之图片预览

    实现图片的展示和大图预览 使用wx.previewImage(OBJECT)来实现 OBJECT参数说明: 参数 类型 必填 说明 current String 否 当前显示图片的链接,不填则默认为 ...

  4. 微信小程序开发之模板

    一.简介 WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用. 定义模板 使用name属性,作为模板的名字.然后在<template/>内定义代码片段,如 ...

  5. 微信小程序开发之多图片上传+服务端接收

    前言: 业务需求,这次需要做一个小程序同时选中三张图片一起上传到服务端,后端使用的.NET WEBAPI接收数据保存. 使用技术: 在这章中将会使用到微信小程序wx.uploadFile(Object ...

  6. 微信小程序开发总结(一)

    微信小程序从2016年9月21日开始内测 ,以及在2017年1月9号正式发布也有一段时间了, 很多人开始拥抱微信小程序,我也是一样 ,从微信小程序内测开始就加入进来 , 开始研究微信小程序 ,属于最早 ...

  7. 微信小程序开发——点击按钮获取用户授权没反应或反应很慢的解决方法

    异常描述: 点击按钮获取用户手机号码,有的时候会出现点击无反应或很久之后才弹出用户授权获取手机号码的弹窗,这种情况下,也会出现点击穿透的问题(详见:微信小程序开发——连续快速点击按钮调用小程序api返 ...

  8. 初尝微信小程序开发与实践

    这可能是一个java程序员最不务正业的一次分享了. 小程序的火热相信不用我多说了,年初的时候老婆去浦东某达面试,甚至都被问有没有小程序测试经验.俨然小程序成为了互联网公司自PC,WAP,安卓,IOS之 ...

  9. 微信小程序开发中的二三事之网易云信IMSDK DEMO

    本文由作者邹永胜授权网易云社区发布. 简介 为了更好的展示我们即时通讯SDK强悍的能力,网易云信IM SDK微信小程序DEMO的开发就提上了日程.用产品的话说就是: 云信 IM 小程序 SDK 的能力 ...

随机推荐

  1. Redis set 数据类型

    sadd() smembers sinter:返回集合的交集 sinterstroe:返回交集结果 sunion :去并集 sunionstore  取得并集 smove 从一个set集合移动到另一个 ...

  2. delphi ios info.plist

    delphi ios info.plist delphi修改info.plist.TemplateiOS.xml文件,然后自动生成project1.info.plist http://docwiki. ...

  3. JEECG新版UI规划,主要提供H5方案(采用主流技术)

    JEECG 结合当前主流的UI技术,在新版3.7.4 即将推出新的UI方案,主要采用Bootstrap,Vue技术.同时提供代码生成器模板(单表.一对多),快速生成你喜好的模板代码. 版本一: Boo ...

  4. day14-函数

    1.定义函数 一个函数就是封闭一个功能def 函数名(): 函数代码注意:函数名不要用默认的关键字.否则会将默认关键字函数覆盖掉. 命名规则与变量相同,使用字母.数字.下划线组成,不能以数字开关 2. ...

  5. LInux 阿里云系统遇到挖矿程序

    参考 https://blog.csdn.net/qq_37837029/article/details/82314428 重要的一点,移除下面文件里面的定时任务 /var/spool/cron/cr ...

  6. APP-8.2-Postman应用

    用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具.今天给大家介绍的这款网页调试工具不仅可以 ...

  7. JAVA 原子操作类

    上文中,guava代码中就用到了,在这里再专门捋一下 部分内容源自: https://www.jianshu.com/p/712681f5aecd https://www.yiibai.com/jav ...

  8. 如何创建Servlet

    //Servlet的生命周期:从Servlet被创建到Servlet被销毁的过程 //一次创建,到处服务 //一个Servlet只会有一个对象,服务所有的请求 /* * 1.实例化(使用构造方法创建对 ...

  9. Java泛型类型擦除以及类型擦除带来的问题

    目录 1.Java泛型的实现方法:类型擦除 1-2.通过两个例子证明Java类型的类型擦除 2.类型擦除后保留的原始类型 3.类型擦除引起的问题及解决方法 3-1.先检查,再编译以及编译的对象和引用传 ...

  10. nth-child与nth-of-type区别

    示例详细理解:nth-child(n)与:nth-of-type(n)区别 childselector:nth-child(index) 1,子选择器(childselector,这里是p选择器)选中 ...