注冊登錄

微信小程序onLaunch異步,首頁onLoad先執(zhí)行?

2018-09-20
導(dǎo)讀:本來按照事件順序,小程序初始化時觸發(fā)App里的onLaunch,后面再執(zhí)行頁面Page里的onLoad,但是在onLaunch里請求獲取是否有權(quán)限,等待返回值的時候Page里的onLoad事件就已經(jīng)執(zhí)行了。 //app.js...

本來按照事件順序,小程序初始化時觸發(fā)App里的onLaunch,后面再執(zhí)行頁面Page里的onLoad,但是在onLaunch里請求獲取是否有權(quán)限,等待返回值的時候Page里的onLoad事件就已經(jīng)執(zhí)行了。

 

  1. //app.js
  2. App({
  3. onLaunch: function () {
  4. console.log('onLaunch');
  5. wx.request({
  6. url: 'test.php', //僅為示例,并非真實(shí)的接口地址
  7. data: {
  8. },
  9. success: function(res) {
  10. console.log('onLaunch-request-success');
  11. // 將employId賦值給全局變量,提供給頁面做判斷
  12. this.globalData.employId = res.employId;
  13. }
  14. })
  15. },
  16. globalData: {
  17. employId: ''
  18. }
  19. })
 

  1. //index.js
  2. //獲取應(yīng)用實(shí)例
  3. const app = getApp()
  4.  
  5. Page({
  6. data: {
  7. albumDisabled: true,
  8. bindDisabled: false
  9. },
  10. onLoad: function () {
  11. console.log('onLoad');
  12. console.log('onLoad app.globalData.employId = ' + app.globalData.employId);
  13. //判斷是用戶是否綁定了
  14. if (app.globalData.employId && app.globalData.employId != '') {
  15. this.setData({
  16. albumDisabled: false,
  17. bindDisabled: true
  18. });
  19. }
  20. })

控制臺打印的結(jié)果是

 

  1. onLaunch
  2. onLoad
  3. onLoad app.globalData.employId =
  4. onLaunch-request-success

要是能等完onLaunch請求完再執(zhí)行Page的onLoad方法那該多好。  這里采用的方法是定義一個回調(diào)函數(shù)。  Page頁面判斷一下當(dāng)前app.globalData.employId是否有值,如果沒有(第一次)則定義定義一個app方法(回調(diào)函數(shù))app.employIdCallback = employId => {...}。  App頁面在請求success后判斷時候有Page頁面定義的回調(diào)方法,如果有就執(zhí)行該方法。因?yàn)榛卣{(diào)函數(shù)是在Page里面定義的所以方法作用域this是指向Page頁面。

 

  1. //app.js
  2. App({
  3. onLaunch: function () {
  4. wx.request({
  5. url: 'test.php', //僅為示例,并非真實(shí)的接口地址
  6. data: {
  7. },
  8. success: function(res) {
  9. this.globalData.employId = res.employId;
  10. //由于這里是網(wǎng)絡(luò)請求,可能會在 Page.onLoad 之后才返回
  11. // 所以此處加入 callback 以防止這種情況
  12. if (this.employIdCallback){
  13. this.employIdCallback(res.employId);
  14. }
  15. }
  16. })
  17. },
  18. globalData: {
  19. employId: ''
  20. }
  21. })
 

  1. //index.js
  2. //獲取應(yīng)用實(shí)例
  3. const app = getApp()
  4.  
  5. Page({
  6. data: {
  7. albumDisabled: true,
  8. bindDisabled: false
  9. },
  10. onLoad: function () {
  11. //判斷是用戶是否綁定了
  12. if (app.globalData.employId && app.globalData.employId != '') {
  13. this.setData({
  14. albumDisabled: false,
  15. bindDisabled: true
  16. });
  17. } else {
  18. // 由于 getUserInfo 是網(wǎng)絡(luò)請求,可能會在 Page.onLoad 之后才返回
  19. // 所以此處加入 callback 以防止這種情況
  20. app.employIdCallback = employId => {
  21. if (employId != '') {
  22. this.setData({
  23. albumDisabled: false,
  24. bindDisabled: true
  25. });
  26. }
  27. }
  28. }
  29. }
  30. })

這樣的話,就能實(shí)現(xiàn)想要的結(jié)果。執(zhí)行順序就是:

 

  1. [App] onLaunch -> [Page] onLoad -> [App] onLaunch sucess callback
重磅推薦:小程序開店目錄

第一部分:小商店是什么

第二部分:如何開通一個小商店

第三部分:如何登錄小商店

第四部分:開店任務(wù)常見問題

第五部分:小商店可以賣什么

第六部分:HiShop小程序特色功能

第七部分:小程序直播

第八部分:小程序收貨/物流

第九部分:小程序怎么結(jié)算

第十部分:小程序客服

第十一部分:電商創(chuàng)業(yè)

第十二部分:小程序游戲開發(fā)

電話咨詢 微信咨詢 預(yù)約演示 0元開店