今天菜鸟又发现了这个 app.js 和 首页请求先后的问题,但是不同的是,现在菜鸟变强了!

本来菜鸟是想补充以前写的这个问题的博客的,结果一看,发现之前写的是什么狗屎,所以直接删除了,重新写!

问题描述:

微信小程序需要在 app.js 里面去进行用户静默登录等操作,然后首页又需要根据后台返回的用户信息进行请求,那么这个时候问题就来了,可能首页的请求先于 app.js ,那么就会因为获取不到用户信息而报错!

解决办法一 定时器

解决思路:

用一个100ms的定时器去重复确认是否有用户信息,没有就继续确认,有了就清除定时器并进行请求

代码:

this.data.timer = setInterval(() => {
  if(app.globalData.userInfo?.id) {
    clearInterval(this.data.timer);
    wx.request({
      url:"xxxxx",
      method:"POST",
      data: {
        userId: app.globalData.userInfo.id,
        orgId: app.globalData.orgId,
      }
    }).then( res => {
        if(res.status == 200){
	      console.log(res);
	    } else {
	      wx.showToast({
	        title: res.msg,
	        icon: 'error',
	        duration: 2000,
	        mask:true
	      })
	    }
    }).catch( err => {
      console.log(err);
    })
  }
}, 100)

注意:
1、这里还有一个变化的,就是设置一个变量,只有请求到了用户信息,再赋值为 true ,首页还是循环去判断这个变量,其实一样的!
2、记得 onHide 的时候也要清除定时器!

解决办法二 官方

解决思路:

通过 app.js 直接去调取首页的请求!具体思路就是,如果首页能获取到用户id,就直接在首页进行请求,如果获取不到,就通 app.方法名 给app里面的方法赋值成为请求,然后在登录接口的 then 中调用该方法!

代码:
app.js

wx.login({
  success: res => {
    let data = {
      jsCode: res.code,
      appId: getApp().globalData.appId,
    }
    wx.request({
        url: 'xxxxx',
        data: data,
      })
      .then(result => {
        if (result.status == 200) {
          getApp().globalData.userInfo = res.obj
		  this.pageFun(); // 首页方法
        } else {
          wx.showToast({
            title: result.msg
          })
        }
      })
  }
})

首页.js

if(app.globalData.userInfo?.id) {
  wx.request({
    url:"xxxxx",
    method:"POST",
    data: {
      userId: app.globalData.userInfo.id,
      orgId: app.globalData.orgId,
    }
  }).then( res => {
    if(res.status == 200){
      console.log(res);
    } else {
      wx.showToast({
        title: res.msg,
        icon: 'error',
        duration: 2000,
        mask:true
      })
    }
  }).catch( err => {
    console.log(err);
  })
} else {
	app.pageFun = wx.request({
	    url:"xxxxx",
	    method:"POST",
	    data: {
	      userId: app.globalData.userInfo.id,
	      orgId: app.globalData.orgId,
	    }
	  }).then( res => {
	    if(res.status == 200){
	      console.log(res);
	    } else {
	      wx.showToast({
	        title: res.msg,
	        icon: 'error',
	        duration: 2000,
	        mask:true
	      })
	    }
	  }).catch( err => {
	    console.log(err);
	  })
}

注意

菜鸟暂时只知道这两种方法,后面有别的再来补充,这里第二种我没有写代码,现场搞的,可能有点问题,但是知道思路,相信读者不用看我的就可以自己写出来!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐