因为我们代码写出来的是异步操作,浏览器是不会等待你这个方法调用完再调用另外一个方法的,这个时候可以用到async 和await
比如我在onload()或者onshow()里面需要定义两个方法,但是我第二个方法数据是在第一个方法数据里面,这个时候可以用到async和await。async和await必须同时使用,下面是加了同步方法的控制台打印效果,如:
async onShow() { //在函数前面定义async,代表我对这个执行同步操作
await this.getYhInfo()
console.log('aaaa')
// this.GongGaoClick()
},
methods: {
getYhInfo() {
return new Promise((resolve)=>{
let data = {
userId: this.vuex_user.id
}
this.$api.getshequ(data)
.then(res => {
console.log(11, res)
if (res.data.length == 0) {
this.$u.toast("暂未查询到房屋信息");
setTimeout(() => {
uni.navigateTo({
url: "./index"
})
}, 2000);
} else {
this.info = res.data[0]
this.$u.vuex('vuex_homeinfo', this.info)
// console.log(3333, this.vuex_homeinfo)
}
resolve()
})
.catch(res => {
uni.navigateTo({
url: "./index"
})
})
})
},
}
控制台打印代码,显示打印了我第一个方法里面的请求接口返回结果,然后再打印了aaaa
如果我不加async和await的话,控制台不会等你把这个方法调用完,直接是异步方法让你的aaaa先打印,然后再输出你请求的数据
onShow() {
this.getYhInfo()
console.log('aaaa')
// this.GongGaoClick()
},
控制台打印,可以看到是先输出aaaa,然后才返回你的接口数据
使用async和await返回的需是一个Promise对象,然后在代码中执行resolve和reject,在函数里面使用了async和await后,在这个方法里面定义promise对象,如:
getYhInfo() {
return new Promise((resolve,reject) => { //这里可以只放置成功的返回方法
let data = {
userId: this.vuex_user.id
}
this.$api.getshequ(data)
.then(res => {
if (res.data.length == 0) {
this.$u.toast("暂未查询到房屋信息");
} else {
this.$u.vuex('vuex_homeinfo', this.info)
}
resolve() //成功后执行resolve,也可以在resolve里面定义数据,在函数里面放置,这样可以在函数里面获取到定义的数据
})
.catch(res => {
console.log(3)
})
})
},
在你定义的函数方法里面,使用async和await,在封装的函数方法里面可以定义同步请求,执行完之后才执行下一步,可以让循环遍历异步变成同步,如:
async getInfo(){
for (let i = 0; i < this.dd.length; i++) {
let data = {
userId: this.vuex_user.id,
inDate: this.dd[i]
}
await this.getUserIncheckIn(data, i) //同步调用
}
}