| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> 微信小程序JavaScript函数中的异步操作顺序执行 -> 正文阅读 |
|
[JavaScript知识库]微信小程序JavaScript函数中的异步操作顺序执行 |
1.前言小程序开发中经常遇到后一个操作依赖前一个操作异步执行结果的情形。虽然JavaScript是单线程语言,但是主线程中的耗时操作通常都被放入任务队列中异步执行,避免阻塞主线程,例如:
运行test函数发现执行结果为: ?可以看到函数f1,f2和f3中的console部分按照test中的调用顺序依次执行,这是因为这部分代码是在主线程中执行的,是同步执行。而setTimeout的回调函数则未按照调用顺序依次执行,这是因为setTimeout被放入任务队列中异步执行,因为执行耗时f3<f1<f2,所以f3中的setTimeout最先从任务队列中返回到主线程中执行回调函数,而f2最后返回。
?如果f2的执行依赖f1中setTimeout回调函数的执行结果,而f3又依赖f2中的执行结果,则要保证三个函数中的异步操作顺序执行,例如:一个操作需要依次发出多个网络请求才能完成。这里提出一种非阻塞(主线程不用等待)方法,确保三个函数中的异步操作顺序执行。 2.使用轮询的方式确保异步操作顺序执行为了避免小程序UI界面卡顿,不能采用阻塞主线程的方法,因此这里采用setInterval定时器实现异步轮询操作,确保异步操作顺序执行。首先定义顺序执行类:
使用示例
运行test函数输出结果: ?原理 因为JavaScript的类对象作为参数传递时是浅拷贝(传址),所以可以用SequentialExec对象作为函数参数,用running属性记录异步操作的运行状态,用res属性保存异步操作结果,用count计数器决定执行的函数。在这里,SequentialExec类的对象sequence充当了func_list中函数的观察者,即采用了观察者模式。 3.错误捕获对于多个顺序执行的函数,如果其中一个函数出现错误,需要终止执行只需关闭定时器即可:
例如执行f2出现错误:?
?执行结果 4.注意事项(1)上述方法适用于函数f1,f2和f3中只有一个异步函数的情形。 (2)?sequence.running?=?false;必须在异步函数中调用,否则顺序执行不起作用。 5.总结上述方法的优点是保持异步操作执行顺序的同时不会阻塞主线程,方便在多个异步操作中传递数据且处理错误比较方便。 但是缺点也很明显,就是这种方法是侵入式的,会产生大量sequence.running?=?false调用。 |
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 11:42:17- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |