第一次写微信小程序,被异步坑死了,异步是哪个运行的快就先运行了, 运行慢的慢慢运行完,所以根本不能按照程序编写顺序一步步运行正确。
在网上找了好久介绍,Async-await,Promise什么的,弄不清楚具体怎么写,后来终于弄清楚了,按顺序运行的Promise模板格式其实很简单!原理抛开,引用抛开,没有var。如下:
//new Promise模板
new Promise((resolve, reject) => {
resolve(a)
}).then(res => {
})
模板之外不需要写另外的引用了,复杂的需要注意放resolve的位置,resolve表示传运行成功后的值a给then用。
例如云数据库数据一次只能查20个,需要循环查询再用concat拼合数组,但因为for异步,查询数据库总是慢的不一致,就导致按顺序查询出来的在拼合时乱了顺序,还需要全拼合完了再排序。因此需要用Promise确保查询完了,再resolve传递数组去排序。
上例提取可运行的代码片段展示太麻烦,就举个特简单的例子:
例如第一步是:
stepone: function() {
console.log('stepone')
this.setData({
a: true
})
console.log('a1',this.data.a)
},
第二步是:
steptwo: function(b) {
console.log('steptwo')
if (b){
console.log('a2',b)
}
},
第二步需要第一步的a值,因为有先后顺序的要求,可套进模板,如下:
new Promise((resolve, reject) => {
console.log('第一步')
this.stepone()
resolve(that.data.a)
}).then(res => {
//res就是resolve传过来的that.data.a,都可以用
console.log('传值res',res)
console.log('第二步')
this.steptwo(res)
})
还不清楚上面代码放哪,看完整的JS(我这个新手就希望看到这么简单的o(╥﹏╥)o):
Page({
data: {
a: false,
},
/**
* 生命周期函数onLoad--监听页面加载
*/
onLoad: function(options) {
new Promise((resolve, reject) => {
console.log('第一步')
this.stepone()
resolve(this.data.a)
}).then(res => {
//res就是resolve传过来的that.data.a,都可以用
console.log('传值res', res)
console.log('第二步')
this.steptwo(res)
})
},
stepone: function () {
console.log('stepone')
this.setData({
a: true
})
console.log('a1', this.data.a)
},
steptwo: function (b) {
console.log('steptwo')
if (b) {
console.log('a2', b)
}
},
})
运行后截图:
OK,分享完ヾ(◍°∇°◍)ノ゙
其实还有摸索微信小程序的经验可以给我这样第一次接触JS的小白。。但整理分享我会抠细节,太累了(❁´ω`❁)但超级想分享啊~