关键技术点:

作用域问题——回调函数中的作用域已经脱离了调用函数了,因此需要在回调函数外边把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. delphi 动态绑定代码都某个控件

    delphi 动态绑定代码都某个控件 http://docwiki.embarcadero.com/CodeExamples/Berlin/en/Rtti.TRttiType_(Delphi)Butt ...

  2. 关于php MD5加密 与java MD5 加密结果不一致的问题

    针对PHP不是UTF-8编码导致的问题 public String md5(String txt) {              try{                   MessageDiges ...

  3. 08-认识margin

    1.margin margin:外边距的意思.表示边框到最近盒子的距离. /*表示四个方向的外边距离为20px*/ margin: 20px; /*表示盒子向下移动了30px*/ margin-top ...

  4. servlet中请求转发(forword)与重定向(sendredirect)

    请求转发和重定向 request.setAttribute("test","hello"); request.getRequestDispacther(&quo ...

  5. NIPS 2016上22篇论文的实现汇集

    http://blog.csdn.net/jiandanjinxin/article/details/54087592 日前,LightOn CEO 兼联合创始人 Igor Carron 在其博客上放 ...

  6. Visual Studio配置C/C++-PostgreSQL(9.6.3)开发环境(ZT)

    https://www.2cto.com/database/201707/658910.html 开发环境 Visual Studio 2017[15.2(26430.16)] PostgreSQL ...

  7. [SQL]UNPIVOT 多個欄位

    有朋友問「如何直接unpivot成2個欄位」,如下所示, 先準備測試資料如下, view source print? 01 create table T ( 02 no varchar(10), 03 ...

  8. eclipse中配置Tomcat服务器以及新建项目

    eclipse配置Tomcat服务器 http://jingyan.baidu.com/article/ca2d939dd90183eb6d31ce79.html eclipse中配置Tomcat服务 ...

  9. python java scala 单例模式

    Python class Single2(object): """ 同一个对象 """ __instance = None def __ne ...

  10. 重装unbantu 问题集合,下载别人的代码运行问题集合

    安装angular 的时候要全局设置 npm install -g angular-cli nodemon server.js 出现[nodemon] Internal watch failed:xx ...