收藏
回答

如何把openid放在全局呢?

我在app.js文件里加了如下代码:

// 全局openid

wx.cloud.callFunction({

name: 'login'

}).then(res=> {

this.openid = res.result.openid

})



然后在某个页面下加了如下代码:


var global = getApp()

console.log(global)

然后在控制台可以看到已经获取到全局的对象了


然后我尝试把代码改成如下,就报错了,显示undefined,我留意到控制台输出undefined是在最开始的位置,不知道跟异步有没有关系:

var global = getApp()

console.log(global.openid)



————————————————————————

更新:

我把app.js里面的代码改成如下:

wx.cloud.callFunction({

name: 'login'

}).then(res=> {

this.openid = res.result.openid

})

this.test = '123'

然后再访问,却是可以的。。。



最后一次编辑于  2019-11-21
回答关注问题邀请回答
收藏

3 个回答

  • o0o有脾气的酸奶
    o0o有脾气的酸奶
    2019-11-21

    全局变量最好放globalData里

    app.js

    loginByCloud(callback){

        if(this.globalData.openid && this.globalData.openid != ''){

            return callback ? callback(this.globalData.openid) : void 0

        }

        wx.cloud.callFunction({

            name: 'login'

        }).then(res=> {

            this.globalData.openid = res.result.openid

            callback && callback(res.result.openid)

        })

    }

    ==========================

    页面js

    let app = getApp()

    Page({

        onLoad(){

            app.loginByCloud(function(openid){

                console.log('登录成功', openid, app.globalData.openid)

            })

        }

    })

    2019-11-21
    有用 2
    回复 7
    • 扭纹柴
      扭纹柴
      2019-11-21
      谢谢大佬(虽然还在默默调试你给出代码。。。 loginBycloud前面是忘记加function关键词了吗)
      2019-11-21
      回复
    • o0o有脾气的酸奶
      o0o有脾气的酸奶
      2019-11-21回复扭纹柴
      可以不用写啊
      xxxx: function(){}
      xxxx(){}
      xxxx:()=>{}
      都可以
      2019-11-21
      1
      回复
    • 扭纹柴
      扭纹柴
      2019-11-21
      不加就报错了,有可能是我开发工具设置的问题。然后我没能看懂函数里的callback参数是什么意思,这种写法和自执行函数的作用是一样的吗?像这样:(function(){
      ···

      })()
      2019-11-21
      回复
    • o0o有脾气的酸奶
      o0o有脾气的酸奶
      2019-11-21回复扭纹柴
      不一样
      2019-11-21
      回复
    • o0o有脾气的酸奶
      o0o有脾气的酸奶
      2019-11-21回复扭纹柴
      没有报错呀
      2019-11-21
      回复
    查看更多(2)
  • 老张
    老张
    2019-11-21

    我常用的方案:app.js:

    //获取openid不保存在缓存
    getOpenidOnlyCloud: async function () {
      return this.globalData.openid = this.globalData.openid || (await wx.cloud.callFunction({ name: 'login' })).result.OPENID
    },
     
    //获取openid后保存在缓存
    getOpenid: async function () {
      if (this.globalData.openid) return this.globalData.openid
      let openid = wx.getStorageSync('openid')
      if (openid) return this.globalData.openid = openid
      wx.setStorageSync('openid', this.globalData.openid = (await wx.cloud.callFunction({ name: 'login' })).result.OPENID)
      return this.globalData.openid
    },

    其他page里:

    onLoad: async function () {
      this.openid = await app.getOpenid()
    },

    云函数login:

    const cloud = require('wx-server-sdk')
    cloud.init()
    exports.main = (event) => { return { ...event,...cloud.getWXContext()} }
    //可同时支持返回openid和处理cloudID


    2019-11-21
    有用 1
    回复 1
    • 扭纹柴
      扭纹柴
      2019-11-21
      谢谢老张,好使了。。。
      我把代码改了一下,不知道为什么,我把你的代码复制过去会报错:
      2019-11-21
      回复
  • 力场科技
    力场科技
    2019-11-21

    异步问题

    2019-11-21
    有用 1
    回复 4
    • 扭纹柴
      扭纹柴
      2019-11-21
      可以讲讲吗?谢谢~
      2019-11-21
      回复
    • 力场科技
      力场科技
      2019-11-21回复扭纹柴
      云函数从调用到返回结果需要时间,而在它正确返回之前是获取不到的. 之所以报undefined,我猜是你定义openid时未赋初值
      2019-11-21
      1
      回复
    • 力场科技
      力场科技
      2019-11-21回复力场科技
      或者未定义
      2019-11-21
      回复
    • 扭纹柴
      扭纹柴
      2019-11-21
      好的,谢谢啦
      2019-11-21
      回复
登录 后发表内容
问题标签