initAppData() {
return new Promise((resolve, reject) => {
this.getVersion().then(res => {
console.log('版本:' + this.globalData.appletsVersion)
if (res) this.getLocation().then(res => {
console.log('经纬度:' + this.globalData.location.latitude + ',' + this.globalData.location.longitude)
if (res) this.getStoreList().then(res => {
console.log('门店:' + this.globalData.storeInfo.storeName)
resolve(true)
})
})
})
})
},
getLocation() {
let that = this
return new Promise((resolve, reject) => {
wx.getLocation({
type: "wgs84",
success(res) {
var location = {
latitude: res.latitude,
longitude: res.longitude
}
that.globalData.location = location
resolve(true)
},
fail(err) {
reject(err)
}
})
})
},
getStoreList() {
return new Promise((resolve, reject) => {
resolve(true)
})
},
getVersion() {
return new Promise((resolve) => {
resolve(true)
})
},
const app = getApp()
onShow() {
app.initAppData().then(res => {
this.setData({
showDialog: true,
})
console.log(this.data.showDialog)
})
},
给个建议,要么自己删减下上个代码片段,要么console.log标识下是哪里打印的;
我现在只能看到你上面零零碎碎的代码,你可以看看你的initAppData是否有执行到then?
从你回复2L的代码来看,你控制台打印的true是 this.globaldata.isReady的值,
而你onShow里的console.log并未打印出来。
换句话来说,根本不存在什么setData不生效,因为都没运行到。
另外按你给出的代码逻辑上来说,
如果第一次设定了this.globaldata.isReady 为true,后续就不会执行initAppData这个方法,那就不存在setData不生效的问题了。
你要確定this.getVersion()/this.getLocation()/this.getStoreList() 是有進入到then裡面的。
其次你可以這樣嘗試:
initAppData() { return new Promise((resolve, reject) => { if(this.globalData.isReady){ console.log('initAppData isReady resolve') resolve(true) }else{ Promise.all([ this.getVersion(), this.getLocation(), this.getStoreList(), ]).then(res => { console.log('initAppData resolve') resolve(true) }).catch(err => { console.log('initAppData reject',err) }) } }) } onShow() { app.initAppData().then(res => { this.setData({ showDialog: true }) console.log('onShow initAppData',res) }) }
你可以按上面的去嘗試下,
如果打印了 initAppData isReady resolve,則代表之前已經初始化了,不重複執行。
如果打印了initAppData resolve ,則代表你上面的那堆方法都返回了resolve,已經初始化成功了。
如果打印了initAppData reject,則代表你上面的方法有產生失敗的,自行查看是哪個失敗。
最後,排除了initAppData reject這個問題,看看是否打印了onShow initAppData,如果打印了看看界面是有有改變,沒有的話你還是上傳代碼片段吧
代碼片段,你自己看看和你的哪裡有差異。
我這邊運行是沒問題的
從一開始的if(!app.globalData.isReady)這個開始,我猜測是因為isReady已經是true了,並且showDialog默認為false,所以界面顯示為false,而截圖中的console結果未必是onShow中的執行結果。
第二個猜測是initAppData裡面並沒有執行到resolve,你這裡是匯集了3個不同的方法,均返回resolve時才會執行initAppData裡的resolve,只要有一個沒有執行resolve,最終也不會觸發到initAppData裡返回resolve。
但你一開始給出的信息根本沒辦法對上面的猜測進行驗證,所以我才讓你再console的地方加上名字做標記。
最後你上面的回復,理論上是已經執行了setData的,但是你後面回復說沒生效,這個暫時想不到問題是哪裡。
按你的邏輯我也寫了個代碼片段,運行後一切是正常的,你也可以自己試試運行我那個代碼片段看看,如果你自己那個項目還是不行,我建議你是把流程抽離出來,寫個代碼片段,自己看一下是否可以,如果可以的話就檢查抽離前的業務代碼那裡出錯,如果抽離出來也是不行就把代碼片段放上來。
看看能正常打印嘛?
如何可以打印的话,这样写:
wx.nextTick(() => {
// 在这里面写赋值语句
})
getApp().globalData.isReady的值一直为true
你写一下else语句,在else里面随便打印个东西
似乎没有进.then回调,你在.then随便打印个东西试试
还有个问题
onshow里面getApp().globalData.isReady的值是什么?我怀疑最一开始连if语句都没走
教你个方法,可以查看下AppData里面showDialog的值啥,页面绑定的值就是啥
initAppData里面是什么?方便给一下代码片段吗
wxml 代码呢
你定义了that = this,你应该log that.data.showDialog