【微信小程序】wx.login 和 wx.getUserProfile 同时使用问题

2023-10-26

场景

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

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

官方解释

在这里插入图片描述
也就是说,不能在调用方法的回调中使用 wx.getUserProfule()

解决方法

使用Promise.all()方法实现平级调用;

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

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

代码

封装 wx.loginwx.getUserProfile 两个接口:

/**
 * 使用promise封装用户信息接口
 */
getUserInfo:function(){
  return new Promise((resolve,reject) => {
    wx.getUserProfile({
      desc: '用户登录', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
      success: (res) => {
        resolve(res)
      },
      fail:(err) => {
        reject(err)
      }
    })
  })
},

/**
 * 使用promise封装wx.login接口
 */
getLogin:function(){
 return new Promise((resolve,reject) => {
   wx.login({
     success (res) {
       resolve(res)
    },
    fail: (err) => {
      reject(err)
   	}
  })
 })
},

封装登录接口

/**
 * 登录接口
 */
login: function(){
  let userRes = this.getUserInfo()
  let loginRes = this.getLogin()
  //使用promise.all()平级调用
  Promise.all([userRes,loginRes]).then((res) => {
   console.log(res)
   let param = {
     code: res[1].code,
     iv: res[0].iv,
     encryptedData: res[0].encryptedData
   }
   let data = {
     method: "post",
     url: api.apiName.wxLogin,
     params: param
   }
   request.request(data).then(res => {
     wx.setStorageSync('token', res.data)
     wx.setStorageSync('hasLogin', true)
     //获取用户信息
     let data = {
       method: "get",
       url: api.apiName.getUserInfo,
       params: null
     }
     request.request(data).then(res2 => {
       wx.hideLoading({})
       wx.setStorageSync('userInfo', res2.data)
     }).catch(err => {
       wx.hideLoading({})
       console.log(err.msg)
     })
     setTimeout(function(){
       wx.switchTab({
          url: '../../index/index',
       })
     },1500)
    }).catch(err => {
      console.log(err.msg)
    })
  })
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【微信小程序】wx.login 和 wx.getUserProfile 同时使用问题 的相关文章

  • 如何在 CentOS 8 上安装 VirtualBox

    虚拟盒子是一个开源 跨平台的虚拟化平台 它支持多种来宾操作系统 包括 Linux 和 Windows 并允许您同时运行多个虚拟机 在本教程中 我们将解释如何在 CentOS 8 上安装 VirtualBox 在 CentOS 8 上安装 V
  • 在 CentOS 7 上使用 Let's Encrypt 保护 Apache

    Let s Encrypt 是由互联网安全研究小组 ISRG 开发的免费 自动化 开放的证书颁发机构 Let s Encrypt 颁发的证书自颁发之日起 90 天内有效 并且受到当今所有主要浏览器的信任 在本教程中 我们将介绍在运行 Apa
  • 如何在 Ubuntu 18.04 上安装 PostgreSQL

    PostgreSQL 或 Postgres 是一个开源通用对象关系数据库管理系统 PostgreSQL 具有许多高级功能 可让您创建复杂的 Web 应用程序 在本教程中 我们将向您展示如何在 Ubuntu 18 04 上安装 Postgre
  • 电脑开机后卡死,桌面图标点了没反应怎么办

    今天接到客户的电话 说一台台式办公PC出现故障 具体故障现象如下 电脑可以正常开机 开机后点击桌面上的所有图标都没反应 开始菜单可以点开 点开后里面的内容也无法点击打开 右键点击桌面下方启动栏可以点出来选项卡 但是点击选项卡里的内容无法打开
  • 写代码遇到Qt相关问题

    目录 qt clicked 函数 传递数据 QT读取文件个数 QT读txt数据并求出行数和列数 qt读写json 我的json文件 读写函数 换行和不换行的区别就是参数Indented和Compact的区别 把json写到文件中 QT信号槽
  • 低通滤波器算法实现_控制算法之超前-滞后补偿器(Lead_Lag Compensator)

    Lead Lag控制器主要从频域的角度来对被控系统进行校正 改善系统的频域特性 如相角裕度 幅值裕度以及灵敏度等 从而改善系统的稳定性及控制精度 是一种基于频率响应的校正方法 时域的卷积 频域的乘积 这句话很重要 深入理解 一 Lead L
  • flutter 防止widget rebuild(亲测有效2020篇)

    相比这个问题很多开发着都已经遇到了 头疼了很久了吧 我也是 网上搜到各种方法 试了还是不行 下面我举一下场景 跳转场景 页面A gt 页面B gt 页面C gt 页面D 从上面简单都例子 我很悲催的告诉大家不管我从哪个页面跳哪个页面 从B
  • Awk学习笔记

    Awk学习笔记 整理 Jims of 肥肥世家
  • windows下安装openssl的两种方式

    windows下按装openssl 第一种 第二种 因为工作需要第一次接触openssl 中间踩得坑实在是太多了 最后也算放弃了那种安装方式原则了一个比较简单的 第一种 第一种就是网上平常的说的方法 先下载 ActivePerl 5 24
  • 图文使用freetype渲染字体+字体颜色+字体大小

    freetype的介绍各种博客都有 可以搜索看看 freetype2 8的源码及编译出的库及头文件链接 https download csdn net download weixin 40550094 12117925 我这边就直接写dem

随机推荐