首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 初步介绍微信小程序
02 | 还有哪些其它公司的小程序产品
03 | 小程序的特点及开发能力
04 | 新的一年,微信小程序开放了哪些新功能?
05 | 小程序运行机制简介:从零构建一个Web App需要做哪些事情?
06 | 开发环境配置:创建你的第一个小程序项目
07 | icon组件:关于图标的4个实现方案
08 | progress组件:如何自定义实现一个环形进度条?
09 | rich-text组件:如何单击预览rich-text中的图片并保存?
10 | view容器组件及Flex布局(一):学习容器组件view及其重要属性
11 | view容器组件及Flex布局(二):介绍flex布局中常用的样式及样式值
12 | 可移动容器及可移动区域(一):学习使用movable-view与movable-area组件
13 | 可移动容器及可移动区域(二):如何实现侧滑删除功能
14 | scroll-view介绍:在小程序中如何实现滚动锚定?
15 | scroll-view介绍:如果渲染一个滚动的长列表?
16 | 滚动选择器(一):学习使用选择器组件
17 | 滚动选择器(二):使用两种方式自定义实现省、市、区三级联动的选择器
18 | 滑动选择器表单组件:如何基于wxs自定义一个竖向的slider?
19 | 页面链接组件:如何自定义一个导航栏?
20 | image媒体组件(上):如何实现图片的懒加载?
21 | image媒体组件(下):开发中经常遇到的问题?
22 | 如何实现直播间功能?(一):了解live-pusher、live-player组件的主要属性及使用限制
23 | 如何实现直播间功能?(二):如何开启、使用腾讯云的云直播功能
24 | 如何实现直播间功能?(三):安装与使用ffmepg,及使用ffmpeg进行推拉流验证
25 | 如何实现直播间功能?(四):使用live-pusher、live-player组件在小程序中实现直播功能
26 | 如何实现直播间功能?(五):同层渲染
27 | 如何实现直播间功能?(六):live-pusher、live-player组件在开发中的常见问题
28 | web-view(一):了解session、cookie等相关基本概念
29 | web-view(二):了解常见的四种鉴权方式
30 | web-view(三):如何使用koa框架,及如何进行热加载?
31 | web-view(四):如何在服务器端实现cookie与sesson的生成?
32 | web-view(五):如何将session存储到服务器端,及如何实现token验证?
33 | web-view(六):基于koa中间件,实现微信一键登录的后端接口
34 | web-view(七):实现微信用户一键登录
35 | web-view(八):了解正确的微信登录姿势
36 | web-view(九):web-view组件在开发的常见问题讲解
37 | WebGL介绍(一):了解WebGL相关的基础概念
38 | WebGL介绍(二):如何在小程序中取到WebGL上下文环境对象
39 | WebGL介绍(三):了解WebGL的世界坐标系
40 | WebGL介绍(四):重新认识右手坐标系及如何编写顶点着色器代码
41 | WebGL介绍(五):学习片断着色器编写,了解变量修饰变型uniform与attribute
42 | WebGL介绍(六):了解在WebGL中裁剪空间是如何裁剪出来的
43 | WebGL介绍(七):了解着色器变量值的绑定及三种三角形绘制模式之间的差异
44 | WebGL介绍(八):在着色器中使用共享变量,绘制一个颜色渐变的正方形
45 | WebGL介绍(九):完成动画
46 | WebGL介绍(十):绘制一个旋转的立方体
47 | WebGL介绍(十一):在3D绘制中使用纹理材质
48 | WebGL介绍(十二):如何创建相机、场景及光源
49 | WebGL介绍(十三):创建加载器、渲染器与控制器,完成3D模型文件的加载与展示
50 | 网络接口简介(一):如何使用wx.request接口
51 | 网络接口简介(二):将登录代码模块化封装
52 | 网络接口简介(三):Promise介绍及 6 个常用方法
53 | 网络接口简介(四):Promise三个方法any、all与race的使用介绍
54 | 网络接口简介(五):基于Promise+await、async关键字改写登录模块
55 | 网络接口简介(六):关于Page页面隐藏代码执行及Promise对象的catch处理的补充
56 | 网络接口简介(七):学习EventChannel对象
57 | 网络接口简介(八):观察者模式介绍及Event模块实现
58 | 网络接口简介(九):扩展wxp模块的request3方法,实现用户登录的自动融合
59 | tabBar组件(一):系统默认的tabBar组件如何开启及使用
60 | tabBar组件(二):基于系统提供的自定义方式,实现一个tabBar组件
61 | tabBar组件(三):通过自定义组件扩展的方式,给任意组件添加通用方法
62 | 开放接口(一):如何对Page进行全局扩展
63 | 开放接口(二):优化前后端登录代码,解决后端解密错误
当前位置:
首页>>
技术小册>>
微信小程序全栈开发实战(上)
小册名称:微信小程序全栈开发实战(上)
### 54 | 网络接口简介(五):基于Promise+await、async关键字改写登录模块 在微信小程序的全栈开发过程中,网络接口的调用是不可或缺的一环,它连接了前端界面与后端服务,实现了数据的交互与业务逻辑的处理。随着JavaScript ES6及更高版本的普及,`Promise`、`async/await`等异步编程模式成为了处理异步操作的主流方式,极大地简化了代码结构,提高了代码的可读性和可维护性。本章节将重点介绍如何使用`Promise`结合`async/await`关键字来改写微信小程序的登录模块,实现更加优雅和高效的异步流程控制。 #### 一、理解Promise与async/await **1.1 Promise基础** `Promise`是ES6引入的一种新的异步编程解决方案,它代表了一个最终可能完成或失败的操作及其结果值。一个`Promise`有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。`Promise`对象通过`.then()`和`.catch()`方法处理成功和失败的情况,还可以使用`.finally()`来指定无论Promise最终状态如何都会执行的操作。 **1.2 async/await简介** `async`和`await`关键字是建立在`Promise`之上的,使得异步代码看起来和同步代码一样。`async`函数会隐式返回一个`Promise`,而`await`关键字可以暂停`async`函数的执行,等待`Promise`处理完成后再继续执行`async`函数并返回结果。这极大地简化了异步代码的书写和理解。 #### 二、微信小程序登录流程回顾 在深入改写登录模块之前,我们先简要回顾一下微信小程序的登录流程: 1. **调用wx.login()获取code**:用户触发登录操作后,小程序首先调用`wx.login()`接口获取登录凭证`code`。 2. **发送code到服务器换取session_key和openid**:将`code`发送到开发者服务器,服务器使用`code`向微信服务器换取`session_key`和`openid`等信息。 3. **服务器生成自定义登录态(如token)**:服务器根据`openid`等信息生成自定义的登录态(如JWT token),并返回给小程序。 4. **小程序保存登录态**:小程序将接收到的登录态保存到本地存储(如`wx.setStorageSync`),以便后续请求携带。 #### 三、基于Promise+async/await改写登录模块 接下来,我们将使用`Promise`和`async/await`来改写上述登录流程中的关键步骤,使代码更加清晰和易于维护。 **3.1 封装wx.login()的Promise版本** 首先,我们可以封装一个返回`Promise`的`login`函数,用于处理`wx.login()`的异步调用: ```javascript function loginWithPromise() { return new Promise((resolve, reject) => { wx.login({ success(res) { if (res.code) { resolve(res.code); } else { reject(new Error('登录失败:未获取到code')); } }, fail(err) { reject(err); } }); }); } ``` **3.2 使用async/await调用loginWithPromise** 然后,在需要登录的地方,我们可以使用`async`函数结合`await`来调用`loginWithPromise`,从而以同步的方式处理登录逻辑: ```javascript async function handleLogin() { try { const code = await loginWithPromise(); console.log('获取到的code:', code); // 接下来可以发送code到服务器换取session_key和openid } catch (error) { console.error('登录失败:', error); } } // 调用handleLogin函数 handleLogin(); ``` **3.3 发送code到服务器并处理响应** 接下来,我们需要将`code`发送到服务器,并处理服务器的响应。这里同样可以使用`Promise`封装请求函数,并在`async`函数中使用`await`等待响应: ```javascript function fetchSessionKey(code) { return new Promise((resolve, reject) => { wx.request({ url: '你的服务器接口地址', // 替换为你的服务器接口地址 data: { code: code }, method: 'POST', success(res) { if (res.statusCode === 200 && res.data.success) { resolve(res.data); // 假设服务器返回的数据中包含session_key和openid } else { reject(new Error('服务器响应错误:' + res.data.message)); } }, fail(err) { reject(err); } }); }); } // 在handleLogin函数中继续处理 async function handleLogin() { try { const code = await loginWithPromise(); const sessionData = await fetchSessionKey(code); console.log('从服务器获取的session数据:', sessionData); // 保存session_key或token到本地存储 wx.setStorageSync('session_key', sessionData.session_key); // 假设sessionData中包含session_key // 其他登录成功后的处理... } catch (error) { console.error('登录失败:', error); } } // 调用handleLogin函数 handleLogin(); ``` #### 四、总结与扩展 通过本章节的学习,我们掌握了如何使用`Promise`和`async/await`来改写微信小程序的登录模块,使得异步代码更加简洁、易于理解和维护。在实际开发中,这种模式可以广泛应用于各种网络请求的处理中,提升代码的整体质量。 此外,值得注意的是,虽然`async/await`让异步代码看起来像是同步代码,但本质上它仍然是异步的,因此在处理多个异步操作时,仍需注意避免潜在的竞态条件和数据一致性问题。同时,对于复杂的异步逻辑,合理的错误处理和异常捕获也是必不可少的。 最后,随着前端技术的不断发展,新的异步编程模式和库不断涌现,如`async_hooks`(Node.js中的高级异步钩子API)、`RxJS`(响应式编程库)等,它们为开发者提供了更多选择和可能性。因此,持续学习和探索新技术,是成为一名优秀前端开发者的重要途径。
上一篇:
53 | 网络接口简介(四):Promise三个方法any、all与race的使用介绍
下一篇:
55 | 网络接口简介(六):关于Page页面隐藏代码执行及Promise对象的catch处理的补充
该分类下的相关小册推荐:
微信小程序与云开发(下)
微信小程序全栈开发实战(中)
微信小程序与云开发(上)
微信小程序与云开发(中)
微信小程序底层框架实现原理
微信小程序全栈开发实战(下)