首页
技术小册
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 | 开放接口(二):优化前后端登录代码,解决后端解密错误
当前位置:
首页>>
技术小册>>
微信小程序全栈开发实战(上)
小册名称:微信小程序全栈开发实战(上)
### 53 | 网络接口简介(四):Promise三个方法`any`、`all`与`race`的使用介绍 在微信小程序的全栈开发过程中,网络请求是不可或缺的一环,它连接着前端与后端的数据交互,是实现动态内容展示和交互功能的关键。而在处理异步网络请求时,JavaScript 的 Promise 对象为我们提供了一种优雅的方式来处理这些异步操作。本章节将深入介绍 Promise 对象的三个高级方法:`Promise.any()`、`Promise.all()` 和 `Promise.race()`,它们各自在特定的场景下能够极大地提升代码的可读性和效率。 #### 一、`Promise.all()`:并行执行,全部成功 `Promise.all()` 方法接收一个 promise 数组作为参数,并返回一个新的 promise 实例。只有当这个数组里的所有 promise 都成功完成时,返回的 promise 才会解决(resolve),并且它的解决值(resolve value)是一个数组,包含了所有 promise 的解决值,顺序与输入数组中的 promise 顺序一致。如果有任何一个 promise 失败(reject),则返回的 promise 会立即失败,且失败原因是第一个失败的 promise 的失败原因。 **应用场景**: - 当你需要从多个不同的 API 获取数据,并且这些数据之间没有依赖关系,但你需要等待所有数据都加载完成后才能继续执行下一步操作时,`Promise.all()` 显得尤为适用。 **示例代码**: ```javascript function fetchUserData(userId) { return new Promise((resolve, reject) => { // 模拟异步请求 setTimeout(() => { if (userId > 0) { resolve(`User ${userId} data`); } else { reject('Invalid user ID'); } }, 1000); }); } Promise.all([ fetchUserData(1), fetchUserData(2), fetchUserData(3) ]).then(results => { console.log(results); // ["User 1 data", "User 2 data", "User 3 data"] }).catch(error => { console.error(error); // 如果有任何一个请求失败,将捕获错误 }); ``` #### 二、`Promise.race()`:竞争执行,第一个完成 `Promise.race()` 方法同样接收一个 promise 数组作为参数,但它与 `Promise.all()` 的行为截然不同。`Promise.race()` 返回一个新的 promise,这个 promise 会在数组中的任意一个 promise 解决(resolve)或拒绝(reject)时立即以相同的值被解决或拒绝。换句话说,它实现了“竞争”机制,哪个 promise 先完成(无论成功或失败),返回的 promise 就以该 promise 的结果作为自己的结果。 **应用场景**: - 当有多个请求发送,但你只需要第一个返回的结果时,使用 `Promise.race()` 可以有效减少等待时间。 - 超时处理,可以创建一个在指定时间后解决的 promise,与其他请求一起传递给 `Promise.race()`,以实现超时机制。 **示例代码**: ```javascript function fetchWithTimeout(userId, timeout) { return Promise.race([ fetchUserData(userId), // 假设这是实际的请求函数 new Promise((resolve, reject) => { setTimeout(() => reject('Request timed out'), timeout); }) ]); } fetchWithTimeout(1, 500).then(data => { console.log(data); // 如果500ms内请求完成,则显示数据 }).catch(error => { console.error(error); // 如果500ms内请求未完成,则显示超时信息 }); ``` #### 三、`Promise.any()`:并行执行,至少一个成功 `Promise.any()` 是 ES2020 引入的一个新方法,与 `Promise.all()` 类似,它也接收一个 promise 数组作为参数,并返回一个新的 promise。但不同的是,`Promise.any()` 等待的是数组中的任意一个 promise 成功解决(resolve),而不是全部。如果所有传入的 promise 都失败了,则返回一个新的 promise,该 promise 会被拒绝(reject),且拒绝原因是一个包含所有失败原因的 `AggregateError`(一个特殊的 Error 对象,用于表示多个错误)。 **应用场景**: - 在多个备选服务源中请求数据,只要其中一个成功即可。 - 尝试多种方法解决问题,只要有一种方法成功就停止其他尝试。 **示例代码**(注意:由于 `Promise.any()` 是较新的特性,确保你的运行环境支持 ES2020 或使用适当的 polyfill): ```javascript Promise.any([ fetchUserData(100).catch(() => null), // 假设这个用户ID无效,通过catch避免直接reject fetchUserData(2), fetchUserData(3) ]).then(result => { console.log(result); // 输出第一个成功的结果 }).catch(error => { if (error instanceof AggregateError) { console.error('All requests failed:', error.errors); // 处理所有请求失败的情况 } else { console.error('Unexpected error:', error); } }); ``` 在上述代码中,我们通过 `.catch(() => null)` 来处理可能失败的请求,防止它们影响 `Promise.any()` 的结果。这是因为 `Promise.any()` 会忽略那些被解决为 `null` 或 `undefined` 的 promise,只有当所有 promise 都以失败告终时,它才会被拒绝。 #### 总结 `Promise.all()`、`Promise.race()` 和 `Promise.any()` 是处理并行异步操作时的强大工具,它们各自在不同的场景下发挥着重要作用。了解并熟练掌握这些方法的使用,对于提升微信小程序全栈开发的效率和代码质量至关重要。通过合理组合使用这些方法,你可以更灵活地处理复杂的异步逻辑,编写出既高效又易于维护的代码。
上一篇:
52 | 网络接口简介(三):Promise介绍及 6 个常用方法
下一篇:
54 | 网络接口简介(五):基于Promise+await、async关键字改写登录模块
该分类下的相关小册推荐:
微信小程序与云开发(下)
微信小程序底层框架实现原理
微信小程序与云开发(中)
微信小程序全栈开发实战(下)
微信小程序全栈开发实战(中)
微信小程序与云开发(上)