首页
技术小册
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 | 开放接口(二):优化前后端登录代码,解决后端解密错误
当前位置:
首页>>
技术小册>>
微信小程序全栈开发实战(上)
小册名称:微信小程序全栈开发实战(上)
### 55 | 网络接口简介(六):关于Page页面隐藏代码执行及Promise对象的catch处理的补充 在微信小程序的全栈开发过程中,网络接口的使用是不可或缺的一环,它连接着前端页面与后端服务,实现了数据的动态交互。然而,在实际开发中,我们不仅要关注网络请求的发送与接收,还需要考虑页面生命周期对网络请求的影响,特别是当页面隐藏时如何处理未完成的网络请求,以及如何通过Promise的`catch`方法优雅地处理网络请求中可能出现的异常。本章将深入探讨这两个重要话题。 #### 一、Page页面隐藏时的代码执行 微信小程序中,页面的生命周期管理对于开发者来说至关重要。理解并掌握页面从创建到销毁的各个阶段,能够帮助我们更好地控制资源的加载与释放,优化用户体验。当页面因为用户的操作(如滑动到其他页面、点击tab切换等)而隐藏时,如果此时有未完成的网络请求,就需要我们特别处理这些请求,避免造成资源浪费或数据不一致的问题。 ##### 1.1 页面生命周期方法 微信小程序提供了丰富的页面生命周期方法,其中与页面隐藏相关的主要有`onHide`和`onUnload`。 - `onHide`:页面隐藏时触发。一个页面只会调用一次`onUnload`,而`onHide`可能会被调用多次,如多次返回到该页面,`onHide`都会被执行。 - `onUnload`:页面卸载时触发,表示该页面的实例将被销毁,所有的数据、事件监听器以及定时器都将被清理。 ##### 1.2 隐藏时网络请求的处理 当页面隐藏时,如果仍有网络请求在进行,可以采取以下几种策略来处理: - **取消请求**:对于可以取消的请求(如使用`wx.request`时,若后端支持,可通过设置请求头或发送特定请求来中断),可以在`onHide`方法中取消这些请求,避免资源浪费。 - **忽略结果**:如果不希望因为页面隐藏就取消请求,但又不希望处理返回的结果(比如更新UI),可以在`onHide`中设置一个标志位,在请求回调中根据这个标志位决定是否处理结果。 - **延迟处理**:对于某些需要较长时间处理的请求,即使页面隐藏,也可能需要继续等待结果(如上传文件、提交表单等)。这时可以在全局变量中记录请求状态,并在页面重新显示时检查并处理这些状态。 ##### 1.3 示例代码 假设有一个需要较长时间处理的数据提交请求,我们可以在页面隐藏时设置一个标志位,以决定是否处理返回的数据。 ```javascript Page({ data: { isPageActive: true, // 标志页面是否活跃 }, onLoad: function() { // 发起网络请求 this.sendRequest(); }, onHide: function() { this.setData({ isPageActive: false, // 页面隐藏,设置标志位 }); }, sendRequest: function() { wx.request({ url: 'https://example.com/api/data', method: 'POST', data: { // 请求数据 }, success: (res) => { if (this.data.isPageActive) { // 页面活跃时处理结果 console.log('处理结果', res.data); } else { // 页面不活跃时,可选择记录日志、忽略结果等 console.log('页面已隐藏,忽略请求结果'); } }, fail: (err) => { // 错误处理 console.error('请求失败', err); } }); }, // 其他方法... }); ``` #### 二、Promise对象的catch处理的补充 在JavaScript中,Promise是处理异步操作的重要工具,它提供了一种更加简洁和强大的方式来处理异步逻辑。在微信小程序中,网络请求等异步操作也常常通过Promise来封装。正确使用Promise的`then`、`catch`方法,能够让我们更好地控制异步流程,并优雅地处理可能出现的异常。 ##### 2.1 Promise基础 Promise有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。Promise对象代表了一个最终可能完成或失败的操作及其结果值。 - `then`方法接收两个可选的回调函数作为参数:第一个在Promise成功时被调用,第二个在Promise失败时被调用(但通常不推荐在`then`中处理错误,而是使用`catch`)。 - `catch`方法用于指定Promise对象失败时的回调函数。 ##### 2.2 catch处理的最佳实践 - **始终使用catch**:无论你的Promise链中有多少个`then`,都应该在链的末尾添加一个`catch`来捕获可能发生的任何错误。这可以确保所有潜在的错误都能被捕获并处理。 - **避免在then中嵌套catch**:虽然技术上可行,但在`then`中嵌套`catch`会使代码结构变得复杂且难以维护。应尽可能在链的末尾统一处理错误。 - **错误传播**:如果`then`中的回调函数没有处理错误(即没有返回另一个Promise或抛出错误),那么这个错误会“冒泡”到链中的下一个`catch`。利用这一特性,可以集中处理多个`then`中的错误。 - **错误日志**:在`catch`中记录详细的错误日志是非常重要的,这有助于后续的问题排查和修复。 ##### 2.3 示例代码 以下是一个使用Promise进行网络请求,并在`catch`中处理错误的示例。 ```javascript function fetchData() { return new Promise((resolve, reject) => { wx.request({ url: 'https://example.com/api/data', success: (res) => { if (res.statusCode === 200) { resolve(res.data); } else { reject(new Error('请求失败,状态码非200')); } }, fail: (err) => { reject(err); } }); }); } fetchData() .then(data => { console.log('数据获取成功', data); // 假设这里还有其他异步操作... return anotherAsyncOperation(data); // 假设这也是一个返回Promise的函数 }) .then(result => { console.log('另一个异步操作成功', result); }) .catch(error => { console.error('请求过程中发生错误', error); // 这里可以添加更多的错误处理逻辑,如用户提示、错误上报等 }); ``` 在以上示例中,我们定义了一个`fetchData`函数,它返回一个Promise对象,用于封装网络请求的逻辑。然后,我们通过链式调用`then`和`catch`来处理异步请求的成功结果和可能发生的错误。这样的代码结构清晰,易于理解和维护。 综上所述,对于微信小程序中Page页面隐藏时的代码执行及Promise对象的`catch`处理,我们需要关注页面生命周期对网络请求的影响,合理控制资源的使用,并通过优雅的错误处理机制来提升应用的健壮性和用户体验。
上一篇:
54 | 网络接口简介(五):基于Promise+await、async关键字改写登录模块
下一篇:
56 | 网络接口简介(七):学习EventChannel对象
该分类下的相关小册推荐:
微信小程序全栈开发实战(下)
微信小程序与云开发(下)
微信小程序底层框架实现原理
微信小程序与云开发(中)
微信小程序全栈开发实战(中)
微信小程序与云开发(上)