官方文档可以知道

setData函数改变Page的data是同步的,会异步通知视图层data的改变,视图层收到通知后进行渲染。即官方文档里生命周期的Send Data箭头

callback分析

先上代码:

Page({data: {theData: 1},onLoad: function(options) {console.log("data begin:" + this.data.theData);this.setData({theData: 2}, () => {console.log("callback");});console.log("data after:" + this.data.theData);/*长耗时*/for (var i = 0; i < 1000000; i++) {for (var j = 0; j < 2000; j++) {j++;}}console.log("data long after:" + this.data.theData);}
})

结果:

结果描述:data begin:1与data after:2瞬间就打印,并且页面也瞬间显示完成,随后过几秒后data long after才打印,并且紧接着callback也打印了。

结论
1、逻辑层是单线程,视图层的回调callback是异步代码段,因此逻辑层的高耗时代码段执行完成后,异步代码段才会执行。(其实就是js引擎就是单线程,没啥好结论的[捂脸][捂脸])
2、setData函数是同步方法,使用serData后,data对象的值就是修改后的,后面的代码取出的data就是修改后的,可以放心处理不必担心出现异步问题。

callback再分析:

setData后,逻辑层会通知视图层data改变了,随后视图层会进行渲染。

渲染是需要耗时的,这里猜测一下:callback是在逻辑层通知视图层成功后就立即调用,还是在视图层渲染成功后才通知逻辑层调用callback?(即是在1处执行callback还是在2处执行callback?)

先上代码:

Page({data: {colorMap: [],count: 0},onLoad: function() {},change: function() {var columnAmount = 75;var rowAmount = 200;var colorMap = [];//这里随机生成1~5数字,用于前端随机展示5种不同的颜色块,颜色块共200*75个//所以视图层渲染起来会比较慢for (var i = 0; i < rowAmount; i++) {colorMap[i] = [];for (var j = 0; j < columnAmount; j++) {colorMap[i][j] = Math.ceil(Math.random() * 5);}}var that = this;console.log("begin setData")this.setData({//注意该setData会导致视图层较高耗时colorMap: colorMap}, () => {that.data.count++;console.log("callback", that.data.count)if (that.data.count < 5) {that.change();}});}
});
<view class='mycontainer'><view wx:for="{{colorMap}}" class="row" wx:for-item="rowitem"><view wx:for="{{rowitem}}" class='box color{{boxitem}}' wx:for-item="boxitem"></view></view><button bindtap="change">change</button>
</view>
.mycontainer{width: 100%;height: 100%;
}
.box{width: 10rpx;height: 10rpx;float: left;
}
.row{width: 100%;height: 10rpx;
}
.color1{background-color: red;}
.color2{background-color: yellow;}
.color3{background-color: rgb(47, 179, 255);}
.color4{background-color: cyan}
.color5{background-color: orange;}

结果:

结果描述:
点击change后:
1、迅速打印出begin setData
2、然后等了大约半秒
3、模拟器出现随机颜色块,同时控制台打印出callback
4、重复了1~3一共5次

代码可以看出,主要的耗时是在视图层的渲染里的,如果是逻辑层通知视图层成功后就执行callback,那么应该是先打印callback,然后大约半秒,模拟器才出现随机颜色块。因此得出下面结论:

结论:
逻辑层执行setData后,视图层进行渲染,渲染成功后,逻辑层的callback才会被调用。

小结:因此对于要求必须渲染成功后才允许执行某代码块的场景,可以放心使用setData的callback方法。

小程序setData函数小探究相关推荐

  1. 微信小程序 -- (七) 小程序 云函数

    小程序云函数 小程序云函数实在小程序端定义,在云服务器端执行的函数. 在小程序定义完毕后,可以通过开发工具上传部署到云服务器,然后在小程序端调过提供的API接口可以直接调用这些云函数. 云函数示例 定 ...

  2. 微信小程序云函数操作云数据库Mysql

    微信小程序云函数操作云数据库Mysql 参考一 参考二 云函数是一段运行在云端的代码,无需管理服务器,在开发工具内编写.一键上传部署即可运行后端代码. 小程序内提供了专门用于云函数调用的 API.开发 ...

  3. 微信小程序————setData()方法的使用和注意事项

    微信小程序setData()使用: ##Page.prototype.setData(Object data, Function callback) setData 函数用于将数据从逻辑层发送到视图层 ...

  4. 小程序setdata优化_微信小程序 setData的使用方法详解

    微信小程序 setData的使用方法详解 微信小程序 setData的使用方法详解 最近在使用微信小程序的setData时,遇到了以下问题.如下: 官网文档在使用setData()设置数组对象的某个元 ...

  5. 微信小程序setdata方法

    微信小程序setdata方法 微信小程序中有时候需要从其他位置获取数据在前端调用 一般会用到小程序中封装好的setdata方法: /** `setData` 函数用于将数据从逻辑层发送到视图层*(异步 ...

  6. 微信小程序云函数服务器,微信小程序云函数使用的几点说明

    微信小程序云函数是一个好东西,相当于微信为我们提供了一个可以跑node.js的服务器,并且可以外部通过API的方式调用云函数,不过微信的文档一向写的不明不白,初学的时候踩了不少坑,在这里记录下来. 1 ...

  7. 微信小程序云函数使用教程【超详细】

    背景需求 在本人的项目中,需要调用一个http的接口,而微信小程序所有的网络请求都得使用https,因而需要一个中转站,使得在正式发布的时候可以使用http接口.(在调试环境下,只要在本地设置里勾选& ...

  8. 微信小程序云函数中的数据处理后返回

    微信小程序云函数中的数据处理后返回 本文主要演示的是,在微信云函数中调用数据库后,如何对获取的内容在云函数内处理后返回. 主函数 exports.main = async (event, contex ...

  9. 小程序发送邮件,小程序云开发使用云函数发送邮件

    老规矩,先看效果图 通过上面的日志,可以看出我们是158的邮箱给250的邮箱发送邮件,下面是成功接收到的邮件. 准备工作 1,qq邮箱一个 2,开通你的qq邮箱的授权码(会具体讲解) 3,注册自己的小 ...

最新文章

  1. python高并发编程_python_day10_并发编程
  2. MESSL(maven + extjs + spring portlet mvc + spring web flow + liferay )整合架构 5
  3. java线程删除文件,线程“main”java.io.jgitinernalexception中的异常:无法删除临时文件c:\users\13 dec...
  4. 一位软件实施工程师的自述
  5. mysql date类型加一个月jdbc_JDBC操作数据库Date类型数据
  6. vector function trmplate
  7. android 验证码短信验证码,Android​短信验证码倒计时验证的2种常用方式
  8. 十条不错的编程观点(转)
  9. Fmask算法——影像云检测算法
  10. M3U8下载,直播源下载,FLASH下载(三)-直播源下载
  11. emacs linux 教程,Emacs基础入门教程(三)使用 Emacs 必知必会
  12. Google退出中国 Mark
  13. CAD图纸转BMP格式图片时怎么设置输出色彩?
  14. 2018 年 8 月面试路:6 天 21 家公司
  15. 疫情让鲸类暂时远离了人工噪声,但在这之前,它们已被打扰了一百多年
  16. linux mariadb,linux配置mariaDB
  17. SpringBoot整合Tomcat中的组件
  18. linux运行igv报错,IGV 哐当就不能用了,除了换台电脑还能怎么办?
  19. Android二维码多码识别,相册选择二维码,自定义扫码界面
  20. 开发和常用工具推荐清单

热门文章

  1. 杂谈之WEB前端工程师身价
  2. NeuroImage:脑网络分析揭示社交焦虑症患者的大脑功能环路异常
  3. 桌面创建html文件路径,html本地图片路径
  4. delphi 2007 安装提示Invalid Serial Number 超强解决办法
  5. Cmd Markdown 编辑阅读器使用教程
  6. 浅谈互联网金融测试平台规划
  7. ubuntu20.04搭建QGC4.2编译环境
  8. 提高计算机访问硬盘的速度慢,如何加快硬盘相应速度?6大方法提高-万兴恢复专家...
  9. 自己弄了个数字币量化分析软件,感兴趣的朋友自己下载
  10. MyBatis入门-association标签使用