收藏
回答

云开发资源共享,调用方小程序必须每次调用初始化函数,如何公用化?

问一下上面这个如何放在共用方法里面,比如放在app'.js里面,,,然后在页面直接调用init一下,,网上查了试了都报错

能不能贴一下app.js的公用函数代码,还有page.js的调用代码

这是目前的写法,每次都要写一遍前项调用

async getXXX(e) {
    // 声明新的 cloud 实例
    var c1 = new wx.cloud.Cloud({
      resourceAppid: 'xxxxx',
      resourceEnv: 'xxxxx',
    })
    await c1.init()

    // 完成后正常使用资源方的已授权的云资源
    c1.callFunction({
      name: '函数名',
      data: {},
    })
}


可以看这边描述

// 声明新的 cloud 实例
var c1 = new wx.cloud.Cloud({
  // 资源方 AppID
  resourceAppid: 'xxxxx',
  // 资源方环境 ID
  resourceEnv: 'xxxxx',
})
​
// 跨账号调用,必须等待 init 完成
// init 过程中,资源方小程序对应环境下的 cloudbase_auth 函数会被调用,并需返回协议字段(见下)来确认允许访问、并可自定义安全规则
await c1.init()
​
上面的代码如何放在公用函数里面?
​
=======================================================
=======================================================
下面的代码,根据对应新建页面,如何调用就初始化一下c1就行
  
​
// 完成后正常使用资源方的已授权的云资源
c1.callFunction({
  name: '函数名',
  data: {},
})
回答关注问题邀请回答
收藏

4 个回答

  • Cat
    Cat
    2024-12-24

    已经解决,感谢大佬@跨商通

    2024-12-24
    有用
    回复
  • showms
    showms
    2024-12-24

    我的做法是在一个公共的js中(api.js)中写了一个初始化cloud的方法,在app.js中调用这个初始化方法,然后后续有用到cloud的地方比如调用云函数,也放在api.js中。可以参考一下


    api.js

    let cloud;
    //云环境初始化完毕标记
    let wxCloudAlreadyInit = false;
    //云环境初始化完毕回调
    const wxCloudInitCallback = [];
    /**
     * 初始化云能力
     * @returns {Promise<void>}
     */
    const wxCloudInit = async function () {
        const {cloudBase} = env;
        if (!wx.cloud) {
            console.error('请使用 2.2.3 或以上的基础库以使用云能力')
        } else {
            if (cloudBase.useShareResource) {
                const {resourceAppid, resourceEnv} = cloudBase;
                // 声明新的 cloud 实例
                cloud = new wx.cloud.Cloud({
                    //资源方AppID
                    resourceAppid,
                    //资源方环境ID
                    resourceEnv,
                })
    
                // 跨账号调用,必须等待 init 完成
                // init 过程中,资源方小程序对应环境下的 cloudbase_auth 函数会被调用,并需返回协议字段(见下)来确认允许访问、并可自定义安全规则
                const initRes = await cloud.init();
                console.log("初始化云能力完毕:", initRes, "资源方appid:", resourceAppid, "资源方环境ID:", resourceEnv);
            } else {
                await wx.cloud.init({
                    env: env.activeEnv,
                    traceUser: true
                });
                console.log("初始化云能力完毕,当前环境:", env.activeEnv);
                cloud = wx.cloud;
            }
            wxCloudAlreadyInit = true;
        }
    
        this.cloud = cloud;
    
        if (wxCloudAlreadyInit && wxCloudInitCallback.length) {
            console.warn("存在云环境初始化完毕回调函数,开始执行,函数个数:", wxCloudInitCallback.length);
            wxCloudInitCallback.forEach(callback => {
                callback();
            });
        }
    }
    /**
     * 云函数调用
     * @param name
     * @param data
     * @param success
     * @param fail
     * @param complete
     */
    const callCloudFunction = function (name, data, success, fail, complete) {
        const func = () => {
            //执行云函数
            cloud.callFunction({
                // 云函数名称
                name: name,
                // 传给云函数的参数
                data: Object.assign({}, data, {env: env.activeEnv})
            }).then(res => {
                typeof success == 'function' && success(res);
            }).catch(res => {
                typeof fail == 'function' && fail(res);
            }).then(res => {
                typeof complete == 'function' && complete(res);
            });
        }
        if (wxCloudAlreadyInit) {
            func();
        } else {
            wxCloudInitCallback.push(func);
        }
    };
    



    app.js

    App({
        onLaunch: async function (options) {
            console.log("APP onLaunch=>", options);
            await api.wxCloudInit();
    }});
    


    2024-12-24
    有用
    回复
  • 跨商通
    跨商通
    2024-12-24
    async getCloud(){
         if(this.globalData.cloud) return this.globalData.cloud
    
        // 声明新的 cloud 实例
        var c1 = new wx.cloud.Cloud({
          resourceAppid: 'xxxxx',
          resourceEnv: 'xxxxx',
        })
        await c1.init()
        this.globalData.cloud = c1
    },
    async getXXX(e) {
        await this.getCloud()
        // 完成后正常使用资源方的已授权的云资源
        this.globalData.cloud.callFunction({
          name: '函数名',
          data: {},
        })
    }
    


    2024-12-24
    有用
    回复 3
    • Cat
      Cat
      2024-12-24
      async getCloud() 如何放在app.js内,实现公用,,然后新建的page.js去调用 await this.getCloud()初始化和this.globalData.cloud
      2024-12-24
      回复
    • 跨商通
      跨商通
      2024-12-24回复Cat
      const app = getApp()
      这个你都不知道啊?
      2024-12-24
      回复
    • Cat
      Cat
      2024-12-24回复跨商通
      懂了懂了我试试,async getCloud() 放在app.js,,,async getXXX(e)放在page.js
      2024-12-24
      回复
登录 后发表内容