小程序 ajax 加载,小程序实战-小程序网络请求异步加载

f99ab3decdb21007c873ef54c52f2f79.png

最初看到小程序的网络请求的时候,尤其是演示示例中,userInfoReadyCallback这个函数更是一头雾水。其实并不怎么理解.一直很费解.网上各路大侠都有解释,但是就是,不知道是怎么个顺序,而我也是个对程序执行流程很关注的人,现在把我的心得分享给大家.如有理解偏差,还希望各位大侠指教. 以下代码为小程序快速创建项目的代码,里面也有相关的解释,我把一些咱们不用的去掉,重点我们看网络请求这里。

App({

onLaunch: function () {

// 展示本地存储能力

var logs = wx.getStorageSync('logs') || []

logs.unshift(Date.now())

wx.setStorageSync('logs', logs)

// 登录

wx.login({

success: res => {

}

})

// 获取用户信息

wx.getSetting({

success: res => {

if (res.authSetting['scope.userInfo']) {

// 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框

wx.getUserInfo({

success: res => {

// 可以将 res 发送给后台解码出 unionId

this.globalData.userInfo = res.userInfo

// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回

// 所以此处加入 callback 以防止这种情况

if (this.userInfoReadyCallback) {

this.userInfoReadyCallback(res)

}

}

})

}

}

})

},

globalData: {

userInfo: null,

}

})

//index.js

//获取应用实例

const app = getApp()

Page({

data: {

motto: 'Hello World',

userInfo: {},

hasUserInfo: false,

canIUse: wx.canIUse('button.open-type.getUserInfo')

},

//事件处理函数

bindViewTap: function() {

wx.navigateTo({

url: '../logs/logs'

})

},

onLoad: function () {

if (app.globalData.userInfo) {

this.setData({

userInfo: app.globalData.userInfo,

hasUserInfo: true

})

} else if (this.data.canIUse){

// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回

// 所以此处加入 callback 以防止这种情况

app.userInfoReadyCallback = res => {

this.setData({

userInfo: res.userInfo,

hasUserInfo: true

})

}

} else {

// 在没有 open-type=getUserInfo 版本的兼容处理

wx.getUserInfo({

success: res => {

app.globalData.userInfo = res.userInfo

this.setData({

userInfo: res.userInfo,

hasUserInfo: true

})

}

})

}

},

getUserInfo: function(e) {

console.log(e)

app.globalData.userInfo = e.detail.userInfo

this.setData({

userInfo: e.detail.userInfo,

hasUserInfo: true

})

}

})

我们重点看这里index.js 这里的这段

// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回

// 所以此处加入 callback 以防止这种情况

app.userInfoReadyCallback = res => {

this.setData({

userInfo: res.userInfo,

hasUserInfo: true

})

}

这里具体代表着什么呢,首先这只是一个方法的定义,而且,这个方法定义的是全局的再app底下注册的一个新的方法,请注意,这里只是注册了一个方法。 箭头函数=>res 相当于:app.userInfoReadyCallback=function (res){------}

当时我比较疑惑:这个函数定义的res是从哪里来的,如果是服务端传来的数据就算的话,那么如果多个网络请求怎么区分。怎么知道是哪一个对应哪一个的。后来,我反复的思考才想通,其实这里只是个定义,并没有执行。 具体执行是在app.js 这里,大家看到了吗,这里的网络请求是wx.getUserInfo 是小程序api接口函数,他属于异步请求,

wx.getUserInfo({

success: res => {

// 可以将 res 发送给后台解码出 unionId

this.globalData.userInfo = res.userInfo

// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回

// 所以此处加入 callback 以防止这种情况

if (this.userInfoReadyCallback) {

this.userInfoReadyCallback(res)

}

}

})

}

所以,当这个请求发出之后,还是可以做其他的事情,也就是包括后来的index.js页面的加载等,当index页面加载的时候,会有两种情况,一种已经网络请求成功了(在app.js里面已经绑定了会员数据信息),这样的话,再index的onload中直接执行第一个if分支即可if (app.globalData.userInfo),一种是没有成功。那么再index页面加载的时候,就会定义这个全局函数,注意一定要定义为app.函数名,定义了这个函数之后,系统中就有了这个函数定义,那么当app的那个网络请求有反馈结果的时候,就会执行这个函数,把会员的信息绑定到页面上去。这样就会正确同步了数据。

可以这么理解,就是异步加载请求之后,系统还有一个监控,随时监控是否返回了结果。而index页面加载js呢,就是定义系统方法,一旦定义,也就是全局存在了,这都是即时更新的。而那个异步加载请求当有反馈的时候,会判断系统当前的函数定义和状态,一旦符合提交件,立马执行。

关于同步和异步的请求,我们有个很简单的例子可以很好地说明这个问题

同步加载测试

返回结果:

$(function () {

$.ajax({url:"您的远程网址",

type:"GET",

data:{},

// async:true,

async:true,

success:function (data)

{

console.log("success");

//alert('我的数据'+data);

$('#resultView').html(data);

},

error:function (err) {

console.log(err);

} });

$('#resultView').html("Ajax同步测试返回结果"); });

// async:true,

async:true,

ajax这个我们经常用到,用于及时获取后端信息,这个默认是异步的,如果加上async:true,才是同步的,同步的概念就是,必须这个执行完了之后,才能执行下面的,如上例所示,如果是同步的,那么最后的结果显示的是:Ajax同步测试返回结果 因为他先顺序执行了上面的那个,如果是异步的,那么再执行ajax请求的同时,还继续页面其他的加载执行,所以先执行了$('#resultView').html("Ajax同步测试返回结果");后来才有执行了success:这个里面的函数,所以肯定是显示了data里面的数据。有了上面这样的试验之后,我们就很好理解了上面的微信小程序获取用户信息的处理了。

5147beb15fb8e3b4f6868241709a50b8.png

举报/反馈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为手机怎么强制关机_华为忘记锁屏密码怎么办?多品牌手机通用解锁密码

手机忘记登陆密码怎么办?下面小编介绍几种方法,轻松解开那些忘记锁屏密码的手机,第一种方法可能大家还知道,但第二种方法肯定没几个人知道。1、手机原地复活这种方法是可以解决锁屏密码的问题,但也一并把手机上所有的数…

HTML5与搜索引擎优化[转载]

原文:http://lusongsong.com/reed/398.html 我觉得HTML5的兴起完全是因为iPhone和iPad,自从Adobe停止开发flash、Android4.0不支持flash后,我觉得在不久的将来HTML5会广泛应用,而且HTML4已经10年没更新了。 HTML5与HTML4代码结构对…

如何让 zend studio 10 识别 Phalcon语法并且进行语法提示

让 zend studio 10 识别 Phalcon语法并且进行语法提示https://github.com/rogerthomas84/PhalconPHPDoc下载解压后,把里面 phalcon 整个目录复制到 workspace 的C:\Documents and Settings\Administrator\Zend\workspaces\DefaultWorkspace\.metadata\.plugins\org.…

包r语言_R语言入门之寻找你的R包

关于寻找目标R包,一般可以在官网利用关键词搜索即可获得相关信息,不过米老鼠在这里想给大家介绍一个特别的R包,它可以帮助你寻找你想要的理想R包。不过,在正式讲解,我想和大家提醒一下安装R包的注意事项: &…

NOI2011 智能车比赛

SPFA。 我们关键是要找到关键点,包括起点,终点,和相邻矩形接触线段的上端点和下端点(如图有红色圈住的点为关键点)。 我们要做的就是在这些关键点之间连边。 我们把这些关键的点拿出来: 其实就是一些竖直的线段。 除了…

ftp服务器上传文件权限设置,ftp服务器 上传文件权限设置

ftp服务器 上传文件权限设置 内容精选换一换华为云对象存储服务帮助中心,为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档,帮助您快速上手使用对象存储服务。云数据库RDS服务上的MySQL在使用上有一…

悼念512汶川大地震遇难同胞——一定要记住我爱你

Problem Description当抢救人员发现她的时候,她已经死了,是被垮塌下来的房子压死的,透过那一堆废墟的的间隙可以看到她死亡的姿势,双膝跪着,整个上身向前匍匐着,双手扶着地支撑着身体,有些象古人…

获取当前ip_教程丨WIN10系统下设置固定IP或动态IP

无论是电脑、手机或其他一切电子设备,如果需要上网,它就必须有一个IP地址,然后IP地址的获取通常又分为 动态IP(自动获取)或 静态IP(手动设置)两种模式(您所在的网络具体适用哪种模式,请咨询您的网络管理员;目前学校都是…

php实现服务器文件同步,PHPstorm配置同步服务器文件

1、配置服务器一、链接配置服务器打开菜单栏 Tools -> Deployment -> Configurationapp点击 选择 SFTP,并填写相关服务器信息:测试Type:链接类型,这里选择SFTP3dHost:服务器ip地址ormPort:端口&…

oc 实例变量可见度、方法

为什么80%的码农都做不了架构师?>>> ⼀、实例变量可⻅度 public 在类的外部和内部均可访问 protected(默认) 只能在该类和其⼦类内访问 private 只能在该类内访问 ⼆、⽅法(定义、声明、调用&#xff…

使用 js替换网页中的关键词为链接

要求把一段html脚本中的疾病名添加到疾病库的链接&#xff0c;只添加一次&#xff0c;要避开超链接或图片链接。 最初是用的 str.replace(糖尿病, <a href...>糖尿病</a>); 结果找了半天&#xff0c;愣是没找到替换后的效果&#xff0c;原来是有个图片的title中…

凡人修仙传显示无法连接服务器,《凡人修仙传》网络异常及橙色BOSS补偿说明...

【网络异常及橙色BOSS补偿说明】亲爱的玩家朋友&#xff1a;《凡人修仙传》所有服务器由于网络异常在今晚(12月6日晚)陆续出现了延迟与宕机。对广大玩家造成了影响&#xff0c;我们深表歉意&#xff01;网络异常还对部分大区的橙色BOSS造成了影响&#xff0c;导致活动没有顺利进…

白屏优化_今日头条品质优化 图文详情页秒开实践

背景作为一个内容类应用&#xff0c;看新闻读资讯一直是头条用户的核心需求&#xff0c;页面的打开速度直接关系到用户使用头条的核心体验&#xff0c;在头条中&#xff0c;为了更多的承载足够丰富的样式和逻辑下保持多端体验的统一&#xff0c;详情页的内容我们是通过 WebView…

JPA字段长度 Mysql数据库

2019独角兽企业重金招聘Python工程师标准>>> 今天有个表字段超长了&#xff0c;默认是255&#xff0c;当时随手把表结构改成3600。然后晚上回来研究JPA控制的字段长度。 实验一&#xff1a; Column(length50, nullabletrue) private String valueText; 毫无疑问&…

JavaWeb学习----Cookie实现记住密码的功能

【声明】 欢迎转载&#xff0c;但请保留文章原始出处→_→ 生命壹号&#xff1a;http://www.cnblogs.com/smyhvae/ 文章来源&#xff1a;http://www.cnblogs.com/smyhvae/p/4096807.html 【正文】 本文主要内容&#xff1a; •1、什么是Cookie •2、Cookie带来的好处 •3、Co…

【学习笔记】在storyboard中给TabViewController添加tab页面

正题&#xff1a;1、首页动态拖一个UIViewController到storyboard中2、然后右键UITabBarController在木manaul栏右侧的加号连线新的UITabViewController就成功添加完毕转载于:https://blog.51cto.com/3048821/1682420

使用matlab画半透明椭圆

先上最终效果图&#xff1a; 本来是想直接用scatter和alpha来画的&#xff0c;结果在尝试以下代码后&#xff0c;发现无法显示透明效果 scatter(rand(1000,1),rand(1000,1), filled); alpha(0.5) 具体原因可以参考stackoverflow&#xff08;http://stackoverflow.com/questions…

双y轴如何合并图例_如何对图表批量组合、对齐、画中画、合并图例、自动化加标签。。。...

关于图表的组合排版&#xff0c;在之前的微信文章中介绍过很多常规的方法&#xff0c;比如《绘制复杂组合图表的独家秘笈分享》、《如何用Graphpad Prism绘制超复杂组合图&#xff1f;》、《如何用Origin完成图表排版&#xff1f;》等。可是&#xff0c;有小伙伴就问了&#xf…

小米5s的位置服务器,小米手机NFC在哪里?告诉你小米手机NFC位置(包括小米5/5s/6/MIX2/Note3)...

NFC功能的普及为智能手机锦上添花&#xff0c;闪付、充值交通卡、模拟门卡、模拟交通卡...NFC的功能越来越强大了&#xff0c;日常生活中需要用到的地方也越来越多了。可问题往往会在这个时候被发现&#xff0c;许多人在使用NFC的时候总是失败。比如说充值交通卡吧&#xff0c;…

微信转发的文件服务器留存吗,微信转发这种视频会感染病毒泄露隐私?网警的查证结果来了...

原标题&#xff1a;微信转发这种视频会感染病毒泄露隐私&#xff1f;网警的查证结果来了最近网上流传一条“紧急通知”&#xff0c;称微信上流传着一些必须转发后才能继续观看的视频&#xff0c;这些视频其实被内植病毒&#xff0c;一旦转发&#xff0c;机主隐私立马被泄露。真…