微信小程序开发——使用回调函数出现异常: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)
......
详细截图:

异常代码相关源码:
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.云开发介绍 微信小程序开发者众所周知,小程序开发拥有许多限制,当我还是一个菜鸟入门的时候,第一关就卡在了没有备案域名的HTTP请求上面,那时候云开 ...
- 【微信小程序开发•系列文章六】生命周期和路由
这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...
- 微信小程序开发之图片预览
实现图片的展示和大图预览 使用wx.previewImage(OBJECT)来实现 OBJECT参数说明: 参数 类型 必填 说明 current String 否 当前显示图片的链接,不填则默认为 ...
- 微信小程序开发之模板
一.简介 WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用. 定义模板 使用name属性,作为模板的名字.然后在<template/>内定义代码片段,如 ...
- 微信小程序开发之多图片上传+服务端接收
前言: 业务需求,这次需要做一个小程序同时选中三张图片一起上传到服务端,后端使用的.NET WEBAPI接收数据保存. 使用技术: 在这章中将会使用到微信小程序wx.uploadFile(Object ...
- 微信小程序开发总结(一)
微信小程序从2016年9月21日开始内测 ,以及在2017年1月9号正式发布也有一段时间了, 很多人开始拥抱微信小程序,我也是一样 ,从微信小程序内测开始就加入进来 , 开始研究微信小程序 ,属于最早 ...
- 微信小程序开发——点击按钮获取用户授权没反应或反应很慢的解决方法
异常描述: 点击按钮获取用户手机号码,有的时候会出现点击无反应或很久之后才弹出用户授权获取手机号码的弹窗,这种情况下,也会出现点击穿透的问题(详见:微信小程序开发——连续快速点击按钮调用小程序api返 ...
- 初尝微信小程序开发与实践
这可能是一个java程序员最不务正业的一次分享了. 小程序的火热相信不用我多说了,年初的时候老婆去浦东某达面试,甚至都被问有没有小程序测试经验.俨然小程序成为了互联网公司自PC,WAP,安卓,IOS之 ...
- 微信小程序开发中的二三事之网易云信IMSDK DEMO
本文由作者邹永胜授权网易云社区发布. 简介 为了更好的展示我们即时通讯SDK强悍的能力,网易云信IM SDK微信小程序DEMO的开发就提上了日程.用产品的话说就是: 云信 IM 小程序 SDK 的能力 ...
随机推荐
- Spring Cloud (3)B Ribbon 负载均衡 IRule
package com.service.config; import com.netflix.loadbalancer.IRule;import com.netflix.loadbalancer.Ra ...
- Vue.js学习和第一个实例
第一个实例效果图: 1.node.js下载,然后安装.下载地址:链接:http://pan.baidu.com/s/1o7TONhS 密码:fosa 2.下载Vue.js.链接:http://pan. ...
- jquery-menu-aim插件实现二级导航
jquery-menu-aim插件是实现二级导航亚马逊式三角滑动的强力工具,它在性能上极佳,快速滑动,基本无延迟效果,源码位置见对应作者的github,接下来附上样例代码: $(function () ...
- APP-4-百度地图定位
APP-3-百度地图应用 需要根据上一步完成百度地图应用的测试,本文介绍Hbuilder通过MUI框架完成百度地图的定位. 1.代码部分 <!DOCTYPE html> <html& ...
- mysql字符串处理
MySQL字符串操作: substring(column_name, "start_position"); # 从指定的位置(第二个参数, start_position)开始,取到 ...
- 优秀的 Go 存储开源项目和库
可以看到,今年谷歌家的 Go 编程语言流行度有着惊人的上升趋势,其发展也是越来越好,因此本文整理了一些优秀的 Go 存储相关开源项目和库,一起分享,一起学习. 存储服务器(Storage Server ...
- MYSQL如何解决幻读
第一部分 首先要了解下mysql数据库的事务特征之一隔离级别: READ UNCOMMITTED(未提交读): 在READUNCOMMITTED级别,事务中的修改,即使没有提交,对其他事务也都是可见的 ...
- split()方法解析
split()方法用于将字符串分割为字符串数组. 废话不多说,直接贴代码: var str="How are you doing today?" console.log(str.s ...
- Android 操作UI线程的一些方法
我们经常会在后台线程中去做一些耗时的操作,比如去网络取数据.但是当数据取回来,需要显示到页面上的时候,会遇到一些小麻烦,因为我们都知道,android的UI页面是不允许在其他线程直接操作的.下面总结4 ...
- Structs复习 Action传递参数
Structs传递参数通常有三种方式 下面我来一个个介绍 1.属性 Jar包 web.xml <?xml version="1.0" encoding="UTF-8 ...