首页
技术小册
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 | 开放接口(二):优化前后端登录代码,解决后端解密错误
当前位置:
首页>>
技术小册>>
微信小程序全栈开发实战(上)
小册名称:微信小程序全栈开发实战(上)
### 章节 52 | 网络接口简介(三):Promise介绍及 6 个常用方法 在微信小程序全栈开发的旅途中,网络接口的调用是不可或缺的一环,它连接了前端与后端的数据世界,使得动态内容展示、用户交互反馈成为可能。而`Promise`作为处理异步操作的一种强大机制,在现代JavaScript开发中占据了举足轻重的地位。本章节将深入探讨`Promise`的基本概念、工作原理以及在小程序开发中常用的六个方法,帮助读者更好地理解和应用这一技术,优化网络接口的调用与处理流程。 #### 一、Promise概述 ##### 1.1 什么是Promise `Promise`是JavaScript中用于处理异步操作的对象,它代表了一个尚未完成但预期将来会完成的异步操作的结果。它允许你为异步操作的成功(fulfilled)和失败(rejected)情况绑定处理程序。与传统的回调函数相比,`Promise`提供了更优雅的方式来处理异步流程,避免了回调地狱(Callback Hell)的问题。 ##### 1.2 Promise的基本状态 - **Pending(等待中)**:初始状态,既不是成功,也不是失败状态。 - **Fulfilled(已成功)**:意味着操作成功完成。 - **Rejected(已失败)**:意味着操作失败。 一旦Promise被fulfilled或rejected,它的状态就不能再改变。 ##### 1.3 Promise的基本用法 ```javascript let promise = new Promise(function(resolve, reject) { // 异步操作 if (/* 异步操作成功 */) { resolve(value); // 将Promise的状态从"pending"变为"fulfilled",并将异步操作的结果作为回调函数的参数 } else { reject(error); // 将Promise的状态从"pending"变为"rejected",并将错误信息作为回调函数的参数 } }); promise.then( function(value) { // 成功时的回调 }, function(error) { // 失败时的回调 } ); ``` #### 二、Promise的6个常用方法 ##### 2.1 `then()` `then()`方法是Promise最重要的方法之一,用于在Promise成功(fulfilled)后执行一个回调函数,并可以返回一个新的Promise。它接受两个可选参数: - `onFulfilled`:当Promise成功时调用的函数,该函数接收Promise的解决值作为参数。 - `onRejected`:当Promise失败时调用的函数,该函数接收Promise的拒绝原因作为参数。 ```javascript promise.then(value => { console.log(value); // 可以返回一个新的Promise return new Promise(/* ... */); }).then(result => { // 处理上一步返回的新Promise的结果 }); ``` ##### 2.2 `catch()` `catch()`方法用于指定Promise失败时的回调函数,它是`.then(null, rejection)`的语法糖,用于处理Promise被拒绝(rejected)的情况。 ```javascript promise.then(value => { // 处理成功情况 }).catch(error => { // 处理失败情况 console.error(error); }); ``` ##### 2.3 `finally()` `finally()`方法不论Promise最终状态如何,都会执行。它主要用于执行一些清理工作,如关闭文件描述符、释放资源等。 ```javascript promise.finally(() => { // 无论成功或失败,都会执行 console.log('Promise已完成,无论是成功还是失败。'); }); ``` ##### 2.4 `all()` `Promise.all()`方法接收一个Promise对象的数组作为参数,并返回一个新的Promise实例。只有当所有的子Promise都成功完成时,新的Promise才会成功完成,其结果是所有子Promise结果的数组。如果任何一个子Promise失败,新的Promise会立即失败,其结果是第一个失败的子Promise的结果。 ```javascript let promise1 = Promise.resolve(3); let promise2 = 42; let promise3 = new Promise((resolve, reject) => { setTimeout(resolve, 100, 'foo'); }); Promise.all([promise1, promise2, promise3]).then((values) => { console.log(values); // [3, 42, "foo"] }); ``` ##### 2.5 `race()` `Promise.race()`方法同样接收一个Promise对象的数组作为参数,但返回的新Promise实例会在其数组中的任何一个Promise对象成功或失败时,以相同的值或理由解决(resolve)或拒绝(reject)。 ```javascript let promise1 = new Promise((resolve, reject) => { setTimeout(resolve, 500, 'one'); }); let promise2 = new Promise((resolve, reject) => { setTimeout(resolve, 100, 'two'); }); Promise.race([promise1, promise2]).then((value) => { console.log(value); // "two",因为它更快 }); ``` ##### 2.6 `resolve()` 和 `reject()` 虽然`resolve()`和`reject()`并非Promise对象的方法,而是用于在Promise构造函数中定义Promise状态转变的函数,但它们在Promise的创建和使用中扮演着核心角色。`resolve()`将Promise的状态由pending变为fulfilled,`reject()`则将Promise的状态由pending变为rejected。 ```javascript let fulfilledPromise = Promise.resolve(123); fulfilledPromise.then(value => { console.log(value); // 123 }); let rejectedPromise = Promise.reject(new Error('出错了')); rejectedPromise.catch(error => { console.error(error); // Error: 出错了 }); ``` #### 三、Promise在微信小程序中的应用 在微信小程序中,网络请求的API(如`wx.request`)默认返回的就是一个Promise对象,这使得我们可以非常方便地使用`then`、`catch`等方法来处理网络请求的结果或错误。此外,利用`Promise.all`可以并发执行多个网络请求,并在所有请求都完成后统一处理结果,这对于提升应用的性能和用户体验非常有帮助。 例如,同时获取用户信息和商品列表: ```javascript Promise.all([ wx.request({ url: 'https://api.example.com/user', success: res => resolve(res.data) }), wx.request({ url: 'https://api.example.com/products', success: res => resolve(res.data) }) ]).then(([userInfo, products]) => { // 同时处理用户信息和商品列表 console.log(userInfo, products); }).catch(error => { // 处理可能出现的错误 console.error(error); }); // 注意:上面的wx.request用法仅为示意,实际中wx.request已返回Promise,无需再封装 ``` #### 四、总结 通过本章节的学习,我们深入理解了`Promise`的基本概念、工作原理以及在小程序开发中常用的六个方法。`Promise`作为处理异步操作的强大工具,不仅简化了异步编程的复杂度,还提高了代码的可读性和可维护性。在微信小程序的开发过程中,合理利用`Promise`可以极大地优化网络请求的处理流程,提升应用的性能和用户体验。希望读者能够掌握并灵活运用这些知识,为开发高效、稳定的微信小程序打下坚实的基础。
上一篇:
51 | 网络接口简介(二):将登录代码模块化封装
下一篇:
53 | 网络接口简介(四):Promise三个方法any、all与race的使用介绍
该分类下的相关小册推荐:
微信小程序与云开发(中)
微信小程序与云开发(下)
微信小程序全栈开发实战(下)
微信小程序全栈开发实战(中)
微信小程序底层框架实现原理
微信小程序与云开发(上)