小程序async-await同异步问题
title: 小程序async-await同异步问题
categories: 踩坑记录📝
tags:
- 小程序
- js异步
date: 2022-03-15 23:41:44
不熟悉node开发和小程序,某次小项目遇到一些异步问题,在此记录📝。
1. 调用异步函数崩溃😡
exports.userLogin = async (uname, password) => {
//pass
}
描述:在utils.js
中写了userLogin
函数,在login/login.js
登陆页的login
函数中调用,直接崩溃。如下:
login: function () {
//……
let cookies = userLogin(phone_number, password);
//……
}
后了解到async
必须和await
一起使用,遂更改代码为:
let cookies = await userLogin(phone_number, password);
仍然崩溃,因为login
不是异步函数,这时解决方法有两种,第一种是更改login
的函数类型,加上async
修饰;另一种是用异步函数把异步语句包裹从而和login
分离。
//方法一
login: aysync function () {
let cookies = userLogin(phone_number, password);
}
//方法二
login: function () {
!async function () {
let cookies = userLogin(phone_number, password);
} ()
}
2. wx.request() success 回调同步🤕
wx.request
为异步函数,请求成功后触发success`回调,无法把请求数据传出。
最开始使用了一种非常笨拙且不优雅的方式传出数据:页面的data
数据字典,通过在回调函数中that.setData()
存储数据,然后在外部使用this.data.…
取出数据。
后面实在无法忍受这种不方便的写法,找到了Promise
的解决方案。使用resolve()
把数据传出,但需要在前面加上await
来等待异步request执行完毕,不然只会得到Promise对象。
let resp = await new Promise((resolve) => {
wx.request({
url: URL,
method: METHOD,
header: {},
success: res => {
resolve(res.data)
}
})
})
3. wx.request success 回调中添加异步过程🥴
原始代码如下:
async function testFun () {
wx.request({
success: res => {
let a = await ……
}
})
}
本以为wx.request
的外层函数被async
修饰,可以添加await
同步,但上面代码报错again。
解决方法是用async
修饰success
的回调函数:
async function testFun () {
wx.request({
success: async function (res) {
let a = await ……
}
})
}