小程式裡,大多數操作都是非同步操作,一些重要的操作,如從網上獲取重要變數值,必須要保證有值,後續操作才有意義。但非同步操作,又必須把處理放到回撥中,程式碼可讀性降低,而且和大多數正常邏輯相背。
折騰了兩天,試了一些方法,記錄一下:
1、最簡單,用while迴圈等待,發現基本上卡死
2、靈機一動,用showToast自帶的超時功能,迴圈等待,也不行。因為showtoast是非同步執行的。其他的showModel都是非同步執行的,顯示了彈窗後,程式碼仍然會向後執行的。
3、網上找到,用Promise,太複雜,不想這麼做
最後,用這個方式初步解決,在用資料前,判斷變數是否存在,如果沒有,則顯示提示,退出,並在一定時間後重新進入本函式(onShow):
console.log("xunhuan", app.tags) if (app.tags.length == 0) { wx.showToast({ title: '正在下載資料!', image: "/remind.png", duration: 500 }) console.log("jieshu", app.tags) setTimeout(this.onShow, 500) return } console.log("after", app.tags)
但在每個地方都放這麼多程式碼,太難看。想著在app.js裡面,onShow的地方加一個,結果還是不行。因為即使在這裡迴圈檢查,但由於非同步執行,程式碼仍然會正常執行到具體頁面。看來,還得把檢測程式碼放到具體處理中。