收藏
回答

这样获取openid是否存在问题呢?

看官方的例子,获取openid是在app.js的onLaunch里,通过wx.login得到code,然后用开发者服务器进行请求,最终换取到openid,然后把openid保存在globalData.openid里面,方便其他页面直接使用。大概的代码就像下面,网上一般也都这么写的。

但仔细一想,因为换取openid的处理是异步处理,所以很可能其他页面里使用globalData.openid时,openid还没有从服务器返回呢,也就是此时它的值是空。

可是为什么网上都是如下的写法呢,微信官方的例子也是建议在app.js的onLaunch里面的wx.login中用code换取openid,感觉挺奇怪的,大家为什么都不怎么考虑异步问题呢?还是我哪里理解错了。谢谢!

// 登录

wx.login({

  success: res => {

    // ------ 获取凭证 ------

    var code = res.code;

    if (code) {

      // console.log('获取用户登录凭证:' + code);

      // ------ 发送凭证 ------

      wx.request({

        url: '后台通过获取前端传的code返回openid的接口地址',

        data: { code: code },

        method: 'POST',

        header: {

          'content-type': 'application/json'

        },

        success: function (res) {

          if (res.statusCode == 200) {

            // console.log("获取到的openid为:" + res.data)

            that.globalData.openid = res.data

            wx.setStorageSync('openid', res.data)

          } else {

            console.log(res.errMsg)

          }

        },

      })

    } else {

      console.log('获取用户登录失败:' + res.errMsg);

    }

  }

})

回答关注问题邀请回答
收藏

2 个回答

  • Aware
    Aware
    2020-09-15

    用Promise处理就好了

    2020-09-15
    有用
    回复
  • 老张
    老张
    2020-09-14

    https://developers.weixin.qq.com/community/develop/article/doc/000a0aed14c3285bea79e67ee56813

    2020-09-14
    有用
    回复 2
    • 潇湘夜雨2016
      潇湘夜雨2016
      2020-09-15
      感谢回复,我没有用云开发,是自己的后台。其实,很多人是在其他页面的onLoad里去用globalData.openid,这种情况,从服务器获取openid的异步操作没完的概率比较大。我呢,倒不是这种情况,我是在某个页面点击按钮后需要用globalData.openid,所以其实此时大概率从服务器获取openid的异步操作已经完成,可以正常使用globalData.openid了(但毕竟理论上,也存在 极小概率异步操作还没完,也要提防这种极小概率)。所以呢,我想干脆这样做比较好,我在wx.login前加个wx.showLoading,在从服务器获取openid的异步操作成功后再 wx.hideLoading(),这期间即使进入那个按钮的页面,因为wx.showLoading遮盖住页面了,用户点击不了按钮,直到异步操作成功后hideLoading了,用户才能点击按钮,而此时globalData.openid已经有值了。您觉得这种处理方式怎么样?谢谢!
      2020-09-15
      回复
    • 老张
      老张
      2020-09-15回复潇湘夜雨2016
      居然只focus在云开发上,却没有关注我怎么解决onLaunch和onLoad里获取异步数据的办法上。
      2020-09-15
      1
      回复
登录 后发表内容
问题标签