为什么我其他页面获取到的openid还是默认值-1

// app.js
App({
  onLaunch: function () {
    if (!wx.cloud) {
      console.error('请使用 2.2.3 或以上的基础库以使用云能力');
    } else {
      wx.cloud.init({
        // env 参数说明:
        //   env 参数决定接下来小程序发起的云开发调用(wx.cloud.xxx)会默认请求到哪个云环境的资源
        //   此处请填入环境 ID, 环境 ID 可打开云控制台查看
        //   如不填则使用默认环境(第一个创建的环境)
        // env: 'my-env-id',
        traceUser: true,
      });
    }

    this.getOpenId()

    this.globalData = {
      openid: -1
    };
  },
  getOpenId() {
    wx.cloud.callFunction({
      name: 'login',
    }).then(res => {
      console.log(res);
      const openid = res.result.openid
      this.globalData.openid = openid
    })
  }
});

根据您提供的代码,可能的原因是您在调用getOpenId()方法时,OpenID还没有获取到。wx.cloud.callFunction()是一个异步方法,可能需要一些时间才能返回结果。在获取OpenID之前,globalData中的openid属性被设置为默认值-1。如果在获取OpenID之前尝试访问openid属性,将始终返回默认值-1。

为了解决这个问题,您可以在获取到OpenID之后再使用它。例如,您可以在getOpenId()方法中将OpenID存储在全局数据中,然后在需要使用OpenID的其他页面或方法中访问全局数据。这样,您可以确保在获取到OpenID之前,不会尝试访问它。

以下是示例代码,展示了如何将OpenID存储在全局数据中,并在其他方法中访问它:

// app.js
App({
  onLaunch: function () {
    // 初始化云开发
    wx.cloud.init({
      // ...
    });

    // 获取OpenID并存储在全局数据中
    this.getOpenId();
  },

  // 获取OpenID
  getOpenId() {
    wx.cloud.callFunction({
      name: 'login',
    }).then(res => {
      console.log(res);
      const openid = res.result.openid;
      this.globalData.openid = openid; // 存储在全局数据中
    });
  },

  // 全局数据
  globalData: {
    openid: null, // 初始值为null,表示OpenID未获取到
  },
});


在其他页面或方法中,您可以使用以下代码访问OpenID:


const app = getApp();
const openid = app.globalData.openid;
if (openid) {
  // OpenID已获取到,可以使用它进行后续操作
} else {
  // OpenID未获取到,需要等待获取完成
}

在上面的代码中,我们首先使用getApp()方法获取应用程序实例,然后使用globalData属性访问存储在全局数据中的OpenID。如果OpenID已经获取到,我们可以使用它进行后续操作。否则,我们需要等待获取完成。