异步编程——微信小程序

1. 前言

引用来自:微信小程序开发中的多线程处理与异步编程_微信小程序 多线程-CSDN博客

微信小程序是基于JavaScript开发的,与浏览器JavaScript不同,小程序运行在WebView内部,没有多线程的概念。小程序的 JavaScript 是单线程的,也就是说它只有一个主线程来处理所有的任务,包括用户交互、网络请求、动画等。但是,为了提高性能,小程序提供了一些异步编程的方法,比如使用 Promise、async/await 来处理网络请求和其他异步操作。

2. 异步编程的实现

2.1 Promise

参考:JavaScript Promise | 菜鸟教程

Promise 是一个 ECMAScript 6 提供的类,目的是更加优雅地书写复杂的异步任务。 

Promise 构造函数接受一个函数作为参数,该函数是同步的并且会被立即执行,所以我们称之为起始函数。起始函数包含两个参数 resolve 和 reject,分别表示 Promise 成功和失败的状态。

起始函数执行成功时,它应该调用 resolve 函数并传递成功的结果。当起始函数执行失败时,它应该调用 reject 函数并传递失败的原因。

Promise 构造函数返回一个 Promise 对象,该对象具有以下几个方法:

  • then:用于处理 Promise 成功状态的回调函数。
  • catch:用于处理 Promise 失败状态的回调函数。
  • finally:无论 Promise 是成功还是失败,都会执行的回调函数

2.1.1 示例1 Promise返回成功状态

 先以Promise返回成功状态为例,先执行“起始函数”,由于返回成功状态(即使用resolve),会再执行then,再执行finally。

onButton1Clicked(){const promise = new Promise((resolve,reject)=>{setTimeout(()=>{console.log("1秒-第一次打印");resolve();},1000)});promise.then(()=>{console.log("成功")setTimeout(()=>{console.log("2秒-第二次打印");},2000)}).finally(()=>{console.log("最后")});},

打印结果:

我好奇:then是成功才会调用的函数,finally无论成功失败都会调用,那谁先谁后呢?测试发现谁写前面先调用谁,比如我这样写:

promise.finally(...).then();

 打印结果是这样的:

 

不过菜鸟教程中说不建议这样写,建议:最好按 then-catch-finally 的顺序

Q: then、catch 和 finally 序列能否顺序颠倒?

A: 可以,效果完全一样。但不建议这样做,最好按 then-catch-finally 的顺序编写程序。

2.1.2 示例2  Promise 与网络请求wx.request 结合使用

    onReqAuth() {const request = new Promise((resolve, reject) => {wx.request({url: 'https://www.yourhost.cn/api/',data: {sbxh: 'S20230831-001',ident: 'T01',parm: ''},method: 'POST',success: (res) => {resolve(res.data);},fail: (err) => {reject(err)}})});request.then((data) => {console.log('请求成功', data);// decodeURIComponent:解析URL编码let msg = decodeURIComponent(data.msg);console.log(msg);this.data.reqResult = msg;this.setData({reqResult: this.data.reqResult})}).catch((err) => {console.error('请求失败:', err);})},

2.1.3  示例3 then传递值给下一个then

这个示例完全照搬菜鸟教程,

resolve() 中可以放置一个参数用于向下一个 then 传递一个值,then 中的函数也可以返回一个值传递给 then。但是,如果 then 中返回的是一个 Promise 对象,那么下一个 then 将相当于对这个返回的 Promise 进行操作,这一点从刚才的计时器的例子中可以看出来。

new Promise(function (resolve, reject) {console.log(1111);resolve(2222);
}).then(function (value) {console.log(value);return 3333;
}).then(function (value) {console.log(value);throw "An error";
}).catch(function (err) {console.log(err);
});

注意:

  • resolve 和 reject 的作用域只有起始函数,不包括 then 以及其他序列;
  • resolve 和 reject 并不能够使起始函数停止运行,别忘了 return。

 resolve 和 reject 并不能够使起始函数停止运行,这个我是这样理解的:在起始函数内调用resolve 或 reject 不代表起始函数结束了,它会继续执行后面的语句,直到函数结束;然后在起始函数执行完毕后,再去执行对应的成功或失败后需要操作。比如在示例1的resolve后增加打印,将会打印如下:

2.2 async/await

5.3 ES6 async 函数 | 菜鸟教程

2.2.1 async 异步关键词

async 是 ES7 才有的与异步操作有关的关键字。

async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数。

async function testAsync(){return "testAsync";
}onButton1Clicked(){console.log(testAsync());testAsync().then(v =>{console.log(v);})
}

 

2.2.2 await 操作符

 async 函数中可能会有 await 表达式,async 函数执行时,如果遇到 await 就会先暂停执行 ,等到触发的异步操作完成后,恢复 async 函数的执行并返回解析值。

await 关键字仅在 async function 中有效。

function testAwait(){return new Promise((resolve,reject)=>{console.log("testAwait");setTimeout(()=>{console.log("setTimeout");resolve();},1000);});
}async function helloASync(){await testAwait();console.log("helloASync")
}helloASync();

正常情况下,await 命令后面是一个 Promise 对象,它也可以跟其他值,如字符串,布尔值,数值以及普通函数。

function testAwait(){console.log("testAwait");
}
async function helloAsync(){await testAwait();console.log("helloAsync");
}
helloAsync();
// testAwait
// helloAsync

await针对所跟不同表达式的处理方式:

  • Promise 对象:await 会暂停执行,等待 Promise 对象 resolve,然后恢复 async 函数的执行并返回解析值。
  • 非 Promise 对象:直接返回对应的值。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/79383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS-ArkUI V2状态-PersistenceV2:持久化存储UI状态

PersistenceV2类是一个与AppStorageV2类用法非常相似的类。因为它俩是子类和父类的关系。如果不了解AppStorageV2,可以先跳转至了解一下这个类。 HarmonyOS-ArkUI V2工具类:AppStorageV2:应用全局UI状态存储-CSDN博客 PersistenceV2相比于其父类AppStorageV2而言,它存储的…

《Mycat核心技术》第22章:搭建Mycat+Zookeeper+HAProxy+Keepalived+MySQL高可用架构

作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 星球项目地址:https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…

Aosp13 文件应用点击apk无反应的处理

最近遇到一个问题,在A13上,打开文件管理应用时,点击apk 无反应或者启动安装进程后安装完成或取消安装进程,再次点击apk 无反应。在此记录该问题。 做一下修改:root/package/ providers/DownloadProvider/下 jenkinsdel…

SQL刷题记录贴

1.题目:现在运营想要对用户的年龄分布开展分析,在分析时想要剔除没有获取到年龄的用户,请你取出所有年龄值不为空的用户的设备ID,性别,年龄,学校的信息。 错误:select device_id,gender,age,un…

【Windows本地部署n8n工作流自动平台结合内网穿透远程在线访问】

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

python爬虫降低IP封禁,python爬虫除了使用代理IP和降低请求频率,还有哪些方法可以应对IP封禁?

文章目录 前言1. 利用 CDN 节点2. 模拟真实用户行为3. 使用 IP 池轮换策略4. 处理 Cookie 和会话信息5. 分布式爬虫 前言 除了使用代理 IP 和降低请求频率,以下这些方法也能应对 IP 封禁: Python 3.13.2安装教程(附安装包)Python…

光谱相机的成像方式

光谱相机的成像方式决定了其如何获取物体的空间与光谱信息,核心在于分光技术与扫描模式的结合。以下是主要成像方式的分类解析: ‌一、滤光片切换型‌ ‌1. 滤光片轮(Filter Wheel)‌ ‌原理‌:通过旋转装有多个窄带…

AI在市场营销分析中的核心应用及价值,分场景详细说明

以下是 AI在市场营销分析中的核心应用及价值,分场景详细说明: 1. 客户行为分析与细分 AI技术应用: 机器学习:分析用户点击、购买、浏览等行为数据,识别消费模式(如高频购买时段、偏好品类)。聚…

浔川AI翻译v7.0更新预告

亲爱的浔川AI翻译用户: 感谢您一直以来的支持!浔川AI翻译自推出以来,已迭代6个版本,其中**v2.0和v4.0因技术问题(翻译结果显示异常、注册失败、密码找回功能失效等)**被迫下架。我们深知这些问题影响了您…

LabVIEW中二维数组转换为彩色图

在 LabVIEW 编程环境下,有用户想把二维数组转化为彩色图片。通过附件的程序示例,给出了具体实现方法,包括对数据的处理以及颜色映射的设置等内容,还涉及解决数据范围与颜色映射不匹配等问题。公司官网有源码 程序功能及细节 功能&…

【模型常见评价指标(分类)】

目录 常见指标 其他的评估指标 3.1 BLEU 3.2 ROUGE 3.3 困惑度PPL(perplexity) 常见指标 其他的评估指标 3.1 BLEU BLEU(Bilingual Evaluation Understudy,双语评估替补)分数是评估一种语言翻译成另一种语言的文本质量的指标。它将“质…

期货数据API对接实战指南

一、期货数据接口概述 StockTV提供全球主要期货市场的实时行情与历史数据接口,覆盖以下品种: 商品期货:原油、黄金、白银、铜、天然气、农产品等金融期货:股指期货、国债期货特色品种:马棕油、铁矿石等区域特色期货 …

TCP连接建立:为什么是三次握手?

接下来,以三个方面分析三次握手的原因: 1、三次握手才可以阻止重复历史连接的初始化(主要原因) 2、三次握手才可以同步双方的初始化序列号 3、三次握手才可以避免资源浪费 原因一:避免历史连接 简单来说&#xff0…

Table类型的表单

形如下面的图片 1 label与prop属性 const columns[{label: "文件名",prop: "fileName",scopedSlots: "fileName",},{ label: "删除时间",prop: "recoveryTime",width: "200",},{ label: "大小",prop:…

Cesium 加载 本地 b3dm 格式文件 并且 获取鼠标点击处经纬度 (亲测可用)

很奇怪cesium 里面只支持 相对路径 不支持绝对路径 我把 模型放在 /***/Cesium-1.128/Apps/SampleData/Cesium3DTiles/Tilesets 下面 "../../SampleData/Cesium3DTiles/Tilesets/terra_b3dms/tileset.json",所有源码 const viewer new Cesium.Viewer("cesiu…

Spring AI核心之“ChatClient”-来自DeepSeek

在 Spring AI 生态中,ChatClient 是一个面向开发者设计的高层抽象接口,它简化了与大型语言模型(LLMs)的交互流程,尤其适用于需要快速构建端到端 AI 应用(如聊天机器人、RAG 问答系统等)的场景。…

购买电脑时,主要需要关注以下核心配置,它们直接影响性能、使用体验和价格。根据需求(办公、游戏、设计、编程等),侧重点会有所不同。看看Deepseek的建议

1. 处理器(CPU) 作用:电脑的“大脑”,影响整体运算速度和多任务处理能力。关键参数: 品牌与型号:Intel(酷睿i3/i5/i7/i9)或 AMD(锐龙R3/R5/R7/R9)。核心/线程…

408数据结构绪论刷题001

答案:D 解析: • A选项:数据元素是组成数据对象的基本单位 ,它只是数据的基本个体,不能完整定义数据结构,所以A选项错误。 • B选项:数据对象是性质相同的数据元素的集合,仅仅描述…

c++STL——vector的使用和模拟实现

文章目录 vector的使用和模拟实现vector的使用vector介绍重点接口的讲解迭代器部分默认成员函数空间操作增删查改操作迭代器失效问题(重要)调整迭代器 vector的模拟实现实现的版本模拟实现结构预先处理的函数尾插函数push_backswap函数赋值重载size函数reserve函数 迭代器默认成…

Java深入

String相关的类 1.String不可变的类 源码&#xff1a; public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/** The value is used for character storage. */private final char value[];/** Cache the hash code for th…