小程序Page里的函数比app.js先执行的解决办法
问题描述:
当我们初始化一个小程序时,默认文件 app.js 中有onLaunch函数,
onLaunch: function () {
console.log("onLaunch");
wx.login({
success: res => {
console.log("login");
// 发送 res.code 到后台换取 openId, sessionKey, unionId
}
})
}
默认目录,"pages/index/index", 中index.js 有 onLoad函数
onLoad: function () {
console.log("index onLoad");
}
小程序网络请求默认为异步请求,在app.js的onLaunch运行后进行异步请求时,程序不会停止,index.js页已执行onload, onload里面的数据会因为没有获取到app.js里的东西而报错, 我们希望onLaunch执行完后再执行onLoad。
他们的执行顺序是:
onLaunch > index onLoad > login
我们希望的执行顺序是:
onLaunch > login > index onLoad
解决办法
定义回调函数, onload里获取不到东西就一直获取,不执行下一步操作,直到获取到app.js的数据才继续执行。若login返回为空,则给app.js注册一个loginSuccessCallback回调,这个回调方法的执行时机,就是app.js中的异步请求完毕
把 app.js 中的 onLaunch 中方法拿到 index.js 文件中,按照自己的逻辑写
使用promise
方法1:
App({
onLaunch: function () {
wx.login({
success: res => {
this.globalData.checkLogin = true;
//由于这里是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况
if (this.checkLoginReadyCallback){
this.checkLoginReadyCallback(res);
}
}
})
},
globalData: {
checkLogin: false
}
...
})
//index.js
//获取应用实例
const app = getApp()
Page({
data: {
test: false
},
onLoad: function () {
let that = this;
//判断onLaunch是否执行完毕
if (app.globalData.checkLogin){
that.setData({
test:true
})
}else{
app.checkLoginReadyCallback = res => {
//登陆成功后自己希望执行的,和上面一样
that.setData({
test:true
})
};
}
}
})
方法2:
把 app.js 中的 onLaunch 中登陆后才执行的方法拿到 index.js 文件中,这是最简单的方法
//index.js
onLoad: function () {
wx.login({
success: res => {
resolve(res);
}
})
}
方法3:
// app.js中定义一个新的方法
App({
onLaunch: function () {
...
},
getAuthKey: function (argument) {
var that = this;
return new Promise(function(resolve, reject){
wx.login({
success: res => {
resolve(res);
}
})
})
}
...
})
//index.js
onLoad: function () {
...
app.getAuthKey().then(function(res){
console.log('res')
})
}
小程序Page里的函数比app.js先执行的解决办法的更多相关文章
- 微信小程序警告设置 enable-flex 属性以使 flexbox 布局生效的解决办法
微信小程序警告设置 enable-flex 属性以使 flexbox 布局生效的解决办法 具体情况: scroll-view 滚动,设置 display:flex 不生效并警告设置 enable-fl ...
- 微信小程序上传后发布或者体验版测试无数据解决办法
在做微信小程序开发的过程中,发现小程序在本地调用接口的数据都显示,但是上传之后,发现手机体验没有数据.以下为解决办法: 1.先清除缓存试试. 2.打开微信小程序工具右上角的详情——项目设置,将“不校验 ...
- 微信小程序填坑,wx.request() 内调用setData()方法错误的解决办法
再方法内添加一行代码,把this对象赋值给给一个变量供success()方法内调用 核心代码: var v = this.txt; 完整示例 abc:function(e){//该函数用于和后台交互 ...
- centos7下/etc/rc.local文件里配置的开机启动项不执行的解决办法
习惯于在/etc/rc.local文件里配置我们需要开机启动的服务,这个在centos6系统下是正常生效的.但是到了centos7系统下,发现/etc/rc.local文件里的开机启动项不执行了!仔细 ...
- 微信小程序-Page生命周期
QQ讨论群:785071190 微信小程序开发之前我们还需认识一下小程序页面的生命周期,丛"微信小程序-代码构成"一文中我们可以了解到小程序页面中有一个.js的文件,这篇博文我们来 ...
- 小程序重新封装打印函数console.log
习惯性使用console.log打印获取到的数据,信息等,然后上星期大佬看见了说怎么那么多打印信息出来,线上那个也是吗?问我能不能线上的就不打印出来? 我就说那就封装一个打印函数呗. 重写一个没问题, ...
- 微信小程序来了 要杀死一切App
从昨晚一些自媒体开始陆续爆料,到微信官方宣布,这一次只隔了短短几小时.就在刚刚,今天早晨,微信官方正式宣布“应用号”开始内测,并暂定名为“小程序”. 应用号变成小程序 腾讯高级副总裁张小龙也在其朋友圈 ...
- 微信小程序开发 -- 通过云函数下载任意文件
微信小程序开发 -- 通过云函数下载任意文件 1.云开发介绍 微信小程序开发者众所周知,小程序开发拥有许多限制,当我还是一个菜鸟入门的时候,第一关就卡在了没有备案域名的HTTP请求上面,那时候云开 ...
- 微信小程序云开发-云函数-云函数获取参数并实现运算
1.编写加法运算的云函数addData 2.在本地小程序页面调用云函数
随机推荐
- C. Almost Equal
C. Almost Equal n个数字全排成一个圈,满足任意相邻n个之和之间最大最小值之差不超过1 n为偶数时 不存在 n为奇数,构造 #include<bits/stdc++.h> u ...
- Java网络编程与NIO详解11:Tomcat中的Connector源码分析(NIO)
本文转载 https://www.javadoop.com 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.c ...
- RESTful风格编程
参考文档:http://blog.didispace.com/springbootrestfulapi/ https://www.jianshu.com/p/91600da4df95 *)RESTfu ...
- angular ajax
在使用angular 发送ajax的时候,状态信息是正常的,状态码200,返回的参数是使用@responsebody转换后返回的字串.在前端却总是在调用错误的回调函数,也拿不到正确的反馈信息. 回调函 ...
- 分类汇总统计mysql数据库一个字段中不同的记录的总和
方法1.用 if 语句,如下例. 方法2.用case when then else 语句,用法如同if. mysql> select sum(if(id<500,1,0)),sum(if( ...
- mongodb 语法小结
数据库 一个mongodb中可以建立多个数据库. MongoDB的默认数据库为"db",该数据库存储在data目录中. MongoDB的单个实例可以容纳多个独立的数据库,每一个都有 ...
- 鸡肋工具-Oracle建表工具
为什么叫鸡肋工具呢,因为我们完全可以在pl/sql上直接建立表.索引.同义词.授权.触发器等. 写这个工具目的是因为公司的本地.测试环境开发无权创建表,每次成员建表语句千奇百怪不规范,所以写了这么个工 ...
- http://blog.csdn.net/sdksdk0/article/details/50749326
http://blog.csdn.net/sdksdk0/article/details/50749326
- django框架ORM数据库
字段类型 选项 null是数据库范畴的概念,blank是表单验证范畴的 外键 在设置外键时,需要通过on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,在django.db.mode ...
- android:为ListView 添加自定义头部和尾部,上拉主动加载 .(引)
1.加头尾部 (1)定自义一个xml布局 my_headview.xml 在Activity类里找到这个自定义布局,并添加到头部 LinearLayout hearderViewLayout = ( ...