7***@qq.com
7***@qq.com
  • 发布:2022-04-27 01:29
  • 更新:2022-04-27 18:15
  • 阅读:641

关于云对象返回值

分类:uniCloud
  • 最近发现官方推出了云对象, 然后实验了,
    按照官方例子 ,写了一个以前云函数上小程序上的登录.
    但是发现为啥我用 return 前端无法接收值呢????
    控制台里面一直显示是undefined. 经过测试发现如果我写在函数结尾最后面用return 是可以返回值,,请问是啥情况呢?
getOpenid: async function(code = '') {  
        const {  
            appId,  
            secret  
        } = wxmpConfig;  
        let weXinApiUrl =  
            `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${secret}&js_code=${code}&grant_type=authorization_code`  

        await uniCloud.httpclient.request(weXinApiUrl, {  
                dataType: 'json',   
            })  
            .then(async (result) => {  
           return {  
                    errCode: 0,  
                    errMsg: '成功'  
                }  

}  
.....
2022-04-27 01:29 负责人:DCloud_uniCloud_WYQ 分享
已邀请:
呆狗的一生

呆狗的一生 - 呆狗的一生

你写的代码是如此的混乱。先说结果,在 await前加个return。OK
有如下不足

  1. 云对象无论你加不加async都返回Promise(如果必须用await才加)。改成如下就好

    getOpenid(code = ''){  }
  2. 云对象的方法保证返回一个值就行(无论是普通值还是Promise),而你是在then里返回的,是无效的。你要在await前加return(另外,await也没有用,可以删了)

  3. then方法里不用加async,加了也不影响,所以不加

  • 7***@qq.com (作者)

    我那个async 是因为。then内部还要有判断,然后我会继续return ,不加async 后面的请求函数不加await根本拿不到结果

    2022-04-27 16:41

呆狗的一生

呆狗的一生 - 呆狗的一生

建议好好学习Promise

呆狗的一生

呆狗的一生 - 呆狗的一生

getOpenid(code = '') {    
        const {    
            appId,    
            secret    
        } = wxmpConfig;    
        let weXinApiUrl =    
            `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${secret}&js_code=${code}&grant_type=authorization_code`    

        return uniCloud.httpclient.request(weXinApiUrl, {    
                dataType: 'json',     
            })    
            .then( result => {    
           return {    
                    errCode: 0,    
                    errMsg: '成功'    
                }    
         })  

} 
呆狗的一生

呆狗的一生 - 呆狗的一生

你要明白then函数里的 return 应该返回一个Promise(如果不是Promise,自动包装成一个Promise),其作用是,为下一个链式then方法提供实参(如果有下一个,没有的话,就理解成返回了一个全新的Promise)。而你的函数并未返回任何值(加return就好)

  • 7***@qq.com (作者)

    哦这样,知道了, 但是那就挺麻烦了,我如果根据.then内结果继续判断分两种情况,内部会有不同的return ,,那样怎么写?

    2022-04-27 16:38

呆狗的一生

呆狗的一生 - 呆狗的一生

then内结果继续判断分两种情况,可以这样写

function hello() {  
    return new Promise((resolve, reject) => {  
        let num = Math.random()  
        if (num > 0.5) return resolve(num)  
        else return resolve('无效')  
    }).then(res => {  
        // 输出【无效】或【大于0.5的一个数】  
        console.log(res)  
        switch (typeof res) {  
            case 'number':  
                return '数字'  
                break;  
            case 'string':  
                return "字符串"  
                break;  
            default:  
                throw Error()  
                break;  
        }  
    }).then(res => {  
        // 输出【数字】或【字符串】  
        console.log(res)  
    }).then(res => {  
        // 输出undefined,因为上一阶段没有return任何值  
        console.log(res)  
    })  

}

该问题目前已经被锁定, 无法添加新回复