最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 微信小程序app.onLaunch与page.onLoad异步问题

    正文概述 掘金(三言)   2021-04-27   769

    微信小程序app.onLaunch与page.onLoad异步问题

    问题:

    相信很多人都遇到过这个问题,通常我们会在应用启动app.onLaunch() 去发起静默登录,同时我们需要在加载页面的时候,去调用一个需要登录态的后端 API 。由于两者都是异步,往往page.onload()调用API的时候,app.onLaunch() 内调用的静态登录过程还没有完成,从而导致请求失败。

    解决方案:

    1. 通过回调函数

    // on app.js
    App({
        onLaunch() {
          login()
          	// 把hasLogin设置为 true
            .then(() => {
            	this.globalData.hasLogin = true;
              if (this.checkLoginReadyCallback) {
                this.checkLoginReadyCallback();
              }
          	})
          	// 把hasLogin设置为 false
            .catch(() => {
            	this.globalData.hasLogin = false;
          	});
        },
    });
    
    // on page.js
    Page({
        onLoad() {
          if (getApp().globalData.hasLogin) { // 登录已完成
                fn() // do something
          } else {
                getApp().checkLoginReadyCallback = () => {
                  fn()
                }
          }
        },
    });
    
    

    ⚠️注意:这个方法有一定的缺陷(如果启动页中有多个组件需要判断登录情况,就会产生多个异步回调,过程冗余),不建议采用。


    2. 通过Object.defineProperty监听globalData中的hasLogin值

    // on app.js
    App({
        onLaunch() {
          login()
          	// 把hasLogin设置为 true
            .then(() => {
            	this.globalData.hasLogin = true;
          	})
          	// 把hasLogin设置为 false
            .catch(() => {
            	this.globalData.hasLogin = false;
          	});
        },
      	// 监听hasLogin属性
        watch: function (fn) {
            var obj = this.globalData
            Object.defineProperty(obj, 'hasLogin', {
              configurable: true,
              enumerable: true,
              set: function (value) {
                this._hasLogin = value;
                fn(value);
              },
              get: function () {
                return this._hasLogin
              }
            })
        },
    });
    
    // on page.js
    Page({
        onLoad() {
          if (getApp().globalData.hasLogin) { // 登录已完成
                fn() // do something
          } else {
                getApp().watch(() => fn())
          }
        },
    });
    

    3. 通过beautywe的状态机插件(项目中使用该方法)

    // on app.js
    import { BtApp } from '@beautywe/core/index.js';
    import status from '@beautywe/plugin-status/index.js';
    import event from '@beautywe/plugin-event/index.js';
    
    const app = new BtApp({
        onLaunch() {
          // 发起静默登录调用
          login()
    
          // 把状态机设置为 success
            .then(() => this.status.get('login').success())
    
          // 把状态机设置为 fail
            .catch(() => this.status.get('login').fail());
        },
    });
    // status 插件依赖于 beautywe-plugin-event
    app.use(event());
     
    // 使用 status 插件
    app.use(status({
      statuses: [
        'login'
      ],
    }));
    
    // 使用原生的 App 方法
    App(app);
    
    
    // on page.js
    Page({
        onLoad() {
          // must 里面会进行状态的判断,例如登录中就等待,登录成功就直接返回,登录失败抛出等。
          getApp().status.get('login').must().then(() => {
            // 进行一些需要登录态的操作...
          })
        },
    });
    

    具体实现

    具体实现可以参考我的商城小程序项目 项目体验地址:体验 代码:代码


    起源地下载网 » 微信小程序app.onLaunch与page.onLoad异步问题

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元