小程序 onLaunch 与 onLoad 异步问题的解决方案

在小程序中,我们一般在onLaunch中发起登录请求,由于是请求是异步的,在onLoad之后才执行完登录请求,如果在onLoad中需要使用请求后的数据,会发现取不到值,以下是一些解决方式,可以按自己所需使用。

  1. 使用回调函数
// app.js
onLaunch () {
	wx.login({
		success: result => {
			wx.request({
				url: 'test.php' // 示例
				data: {...},
				success: res => {
					this.globalData.openId = res.data.openId
					 // 回调
					if (this.loginCallback) this.loginCallback(res.data)
				},
				fail: err => {
					// 需要的话请求失败处也可以使用回调
				}
			})
		}
	})
}
// page.js
onLoad () {
	const app = getApp()
	if (app.globalData.openId) {
		// do something
	} else {
		app.loginCallback = (data) => {
			// do something
		}
	}
}
  1. 使用Promise
// app.js
App({
	initLogin () {
		return new Promise((resolve, reject) => {
			wx.login({
				success: result => {
					wx.request({
						url: 'test.php' // 示例
						data: {...},
						success: res => {
							resolve(res.data)
						},
						fail: err => {
							reject('error')
						}
					})
				}
			})
		})
	}
})
// page.js
onLoad () {
	const app = getApp()
	app.initLogin().then(res => {
		// do something
	}).catch(err => {})
}
  1. 使用Object.defineProperty监听
// app.js
watch (method) {
	let obj = this.globalData
	// 这里监听 openId
	Object.defineProperty(obj, "openId", {
		configurable: true,
		enumerable: true,
		set: function (value) {
			method(value) // 触发页面回调函数
		}
	})
},
onLaunch () {
	wx.login({
		success: result => {
			wx.request({
				url: 'test.php' // 示例
				data: {...},
				success: res => {
					this.globalData.openId = res.data.openId
				}
			})
		}
	})
}
// page.js
onLoad () {
	const app = getApp()
	app.watch(this.watchBack)
}
watchBack (openId) {
	if (openId) {
		// do something
	}
}
  1. 使用getCurrentPages(官方不建议这么使用,因为可能此时 page 还没有生成)
// app.js
onLaunch () {
	wx.login({
		success: result => {
			wx.request({
				url: 'test.php' // 示例
				data: {...},
				success: res => {
					const currentPage = wx.getCurrentPages()[0]
					// 触发当前页的init方法
					currentPage.init(res.data)
				}
			})
		}
	})
}
// page.js
init (data) {
	// do somethine
}
  1. reLaunch重载页面
// app.js
onLaunch () {
	wx.login({
		success: result => {
			wx.request({
				url: 'test.php' // 示例
				data: {...},
				success: res => {
					// 请求结果存到了storage里,再跳到页面可以获取到storage里的数据
					wx.reLaunch({
						url: '/pages/n-index/n-index',
					})
				}
			})
		}
	})
}
  1. 设置启动页
  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: 小程序的onLaunchonLoad是两个生命周期函数。 onLaunch小程序初始化时执行的函数,只执行一次。在这个函数中,可以获取小程序的启动参数,如场景值、query参数等。 onLoad是页面加载时执行的函数,每次打开页面都会执行。在这个函数中,可以获取页面的参数,如query参数等。同时,也可以在这个函数中进行数据初始化、网络请求等操作。 ### 回答2: 小程序是一种轻量级的应用程序,具有快速启动和使用的优点。在小程序中,onLaunchonLoad是两个重要的函数。onLaunch函数在小程序一开始被加载的时候执行,而onLoad函数则在小程序每次被打开时执行。 onLaunch函数是一个小程序的生命周期中的首个函数,它只会在小程序被初次打开时执行一次。这个函数通常被用来做一些初始化的工作,例如获取用户信息、读取本地缓存数据以及加载各种配置参数。onLaunch函数还可以通过参数options来获取小程序启动时的参数,例如通过微信公众号菜单打开小程序,通过分享链接打开小程序等。 onLoad函数是小程序生命周期中的一个重要函数,每次小程序被打开时都会执行。在这个函数中,可以对小程序页面进行数据初始化和渲染,例如向服务器请求数据、检查用户权限、检查网络连接状态等。与onLaunch函数不同的是,onLoad函数可以接受一个options参数,通过options参数可以获取小程序的入参信息。在onLoad函数中,可以根据入参信息,不同的场景展示不同的页面。 总结一下,onLaunchonLoad小程序中非常重要的函数,在小程序的生命周期中起到了至关重要的作用。onLaunch函数是小程序初始化的时候执行的函数,一般用做全局配置和初始化工作;而onLoad函数是小程序页面被打开时执行的函数,用来搭载页面的初始化数据和逻辑。当我们了解了这两个函数的作用后,在小程序开发时就可以更加高效地使用它们来开发出更加适合的小程序了。 ### 回答3: 小程序是一种轻量级应用,有许多生命周期函数用于控制小程序的运行过程。其中,onLaunchonLoad都是小程序生命周期函数中的重要函数。 onLaunch小程序生命周期函数中的第一个函数,在小程序启动时执行。它通常用于获取小程序的启动参数以及一些必要的全局数据。在该函数中,开发者可以通过参数options来获取小程序的启动参数。同时,开发者可以通过wx.setStorageSync方法将数据存储到本地缓存中。 onLoad小程序生命周期函数中的另一个函数,在小程序页面加载时执行。它通常用于加载页面数据以及执行一些初始化操作。如通过wx.request方法进行数据请求、通过wx.getLocation方法获取用户地理位置信息等。 需要注意的是,onLaunchonLoad小程序生命周期函数的两个不同的部分。onLaunch只会在小程序第一次启动时执行,onLoad则是在每次进入小程序页面时都会执行。另外,onLoad需要在相应的页面进行定义并且需要传入options参数。 总体来说,onLaunchonLoad小程序中非常重要的生命周期函数,它们可以帮助开发者完成一些必要的初始化操作。在使用时,需要根据具体业务场景来选择合适的方式来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZionHH

落魄前端,在线炒粉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值