• 微信小程序中wx.login和wx.getUserProfile的使用


    在使用微信登录时,通常会在调用wx.login获取code后再通过wx.getUserProfile获取iv和encryptedData(加密数据)一起发到后端进行登录验证

    在实际使用中如果在wx.login方法调用后再调用再使用wx.getUserProfile会报错

    官方解释:

     也就是说不能在调用方法的回调中使用wx.getUserProfule()

    解决方法:使用Promise.all()方法实现平级调用

    Promise.all() 方法接收一个promise的iterable类型(注:Array,Map,Set都属于ES6的iterable类型)的输入,并且只返回一个Promise实例, 那个输入的所有promise的resolve回调的结果是一个数组。这个Promise的resolve回调执行是在所有输入的promise的resolve回调都结束,或者输入的iterable里没有promise了的时候。它的reject回调执行是,只要任何一个输入的promise的reject回调执行或者输入不合法的promise就会立即抛出错误,并且reject的是第一个抛出的错误信息。

    简单点说就是会等到两个方法都回调成功该方法才会返回来值,返回值是一个数组。

    上代码

    封装wx.login和wx.getUserProfile两个接口

     
     
     1  /**
     2    * 使用promise封装用户信息接口
     3    */
     4   getUserInfo:function(){
     5     return new Promise((resolve,reject) => {
     6       wx.getUserProfile({
     7         desc: '用户登录', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
     8         success: (res) => {
     9           resolve(res)
    10         },
    11         fail:(err) => {
    12           reject(err)
    13         }
    14       })
    15     })
    16   },
    17 
    18   /**
    19    * 使用promise封装wx.login接口
    20    */
    21   getLogin:function(){
    22     return new Promise((resolve,reject) => {
    23       wx.login({
    24         success (res) {
    25           resolve(res)
    26         },
    27         fail: (err) => {
    28           reject(err)
    29         }
    30       })
    31     })
    32   },
     

    封装登录接口

     
     
     1   /**
     2    * 登录接口
     3    */
     4   login: function(){
     5     let userRes = this.getUserInfo()
     6     let loginRes = this.getLogin()
     7     //使用promise.all()平级调用
     8     Promise.all([userRes,loginRes])
     9     .then((res) => {
    10       console.log(res)
    11       let param = {
    12         code: res[1].code,
    13         iv: res[0].iv,
    14         encryptedData: res[0].encryptedData
    15       }
    16       let data = {
    17         method: "post",
    18         url: api.apiName.wxLogin,
    19         params: param
    20       }
    21       request.request(data)
    22       .then(res => {
    23         wx.setStorageSync('token', res.data)
    24         wx.setStorageSync('hasLogin', true)
    25         //获取用户信息
    26         let data = {
    27           method: "get",
    28           url: api.apiName.getUserInfo,
    29           params: null
    30         }
    31         request.request(data)
    32         .then(res2 => {
    33           wx.hideLoading({})
    34           wx.setStorageSync('userInfo', res2.data)
    35         })
    36         .catch(err => {
    37           wx.hideLoading({})
    38           console.log(err.msg)
    39         })
    40         setTimeout(function(){
    41           wx.switchTab({
    42             url: '/pages/index/index',
    43           })
    44         },1500)
    45       })
    46       .catch(err => {
    47         console.log(err.msg)
    48       })
    49     })
    50   }
     
  • 相关阅读:
    返回一个整型数组中最大子数组的和
    matlab的优缺点
    Android 软件自动更新功能的实现
    Android的依赖注入框架:Dagger
    Wireshark解密HTTPS数据流
    QQ恶搞
    QQ恶搞
    编程语言的分类
    Windows常用快捷键与常用命令
    Chrome去掉标签页8个框
  • 原文地址:https://www.cnblogs.com/Fooo/p/16857699.html
Copyright © 2020-2023  润新知