《智能前端技术与实践》——第 2 章 前端开发基础 ——2.6 深度学习中的 JavaScript——2.6.2 JavaScript数据类型(下)

简介: 《智能前端技术与实践》——第 2 章 前端开发基础 ——2.6 深度学习中的 JavaScript——2.6.2 JavaScript 异步编程(下)

《智能前端技术与实践》——第 2 章 前端开发基础 ——2.6 深度学习中的 JavaScript——2.6.2 JavaScript 异步编程(上): https://developer.aliyun.com/article/1228122?groupCode=tech_library  



2.6.2 JavaScript 异步编程


在 Web 浏览器或微信小程序中部署机器学习应用时,经常会采用从服务器端加载现成的 JavaScript 模型或转换 TensorFlow 模型这两种方法。JavaScript 语言采用的是单线程模型,所 以对于网络 I/O 请求等一些耗时较长的任务,通常会通过设置回调函数、使用 Promise 对象、 使用 async/await 函数来处理。本节将介绍 JavaScript 中的事件循环机制及异步任务的处理方法。


JavaScript 语言最大的特点就是单线程。这意味着所有任务都必须同步执行,即前一个任 务完成后,下一个任务才可以开始,但是如果前一个任务耗时较长,就会使后面的任务一直处 于等待状态,从而造成主线程的阻塞,进而影响页面的渲染。


为了解决这个问题,我们一般将 JavaScript 中可以处理的任务分为同步任务和异步任务。 同步任务是指在 JavaScript 主线程上排队执行的任务;异步任务是指在任务队列中执行的任务, 异步执行的运行机制如下。


• 所有同步任务在 JavaScript 主线程上执行,形成一个执行栈。

• 所有异步任务在任务队列中执行,异步任务包括鼠标单击事件、网络请求事件等(任 务队列又分为宏任务和微任务:宏任务包括 script、setTimeout、setInterval、I/O、UI  Rendering,微任务包括 process.nextTick、Promise、MutationObserver 等)。

• 当执行栈中所有任务执行完毕时,系统会读取任务队列中的任务,并进入执行栈,由 主线程开始执行。

• 主线程不断重复上述过程。


具体运行过程如图 2-29 所示。


当 JavaScript 主线程运行的时候,会 产生堆(heap)和栈(stack)。栈中的代码 会调用外部 API(WebAPI),它们会将所 有异步任务(click 事件、load 事件、done 事件等)加入任务队列(callback queue) 中。当栈中的代码执行完毕时,主线程就 会读取任务队列,并执行队列中异步任务 对应事件的回调函数。主线程会不断从任 务队列中读取事件,直至所有任务处理完 成,如图 2-30 所示。


image.png



image.png


接着,介绍深度学习中常用的两种 JavaScript 异步任务解决方案。


1.使用 Promise 对象


对于传统异步任务,通常会采用回调函数处理,但是该方法会造成无限回调,从而使得程 序结构混乱,不利于后期代码的维护。ECMAScript 6 提供了一种新的异步任务解决方案,即 Promise 对象,它代表一个异步操作最终完成或者失败,共有如下 3 种状态。


• 进行中(pending):初始状态,既没有成功,也没有失败。

• 已成功(fulfilled):操作成功。

• 已失败(rejected):操作失败。


Promise 对象状态的改变只有两种可能—由 Pending 变为 Fulfilled 和由 Pending 变为 Rejected。当发生上述任何一种状态改变后(此时我们称为 Resolved),用 Promise 对象的 then() 方法排列起来的相关处理程序就会被调用,该对象成功实现了用同步的方法编写异步的代码, 避免了回调函数引发的无限回调问题,如图 2-31 所示。


image.png


代码清单 2-25 展示了一段示例代码。


代码清单 2-25


letmyFirstPromise=newPromise(function(resolve, reject){
setTimeout(function(){
resolve("hahaCoder!");
}, 250);
});
myFirstPromise.then(function(successMessage){
console.log("Yay! "+successMessage);
});


代码清单2-25 使用setTimeout()来模拟异步代码。当异步代码执行成功时,才会调用 resolve(); 当异步代码失败时,会调用 reject()。其中 successMessage 的值是调用 resolve()方法所传入 的值。



相关文章
|
10月前
|
前端开发 搜索推荐 开发工具
通义灵码与颜色板生成器,为前端开发提供智能配色解决方案
在前端开发中,色彩搭配对用户体验和界面美观至关重要。通义灵码提供的颜色板生成器通过自动推荐配色方案、随机生成颜色组合及支持自定义调整,帮助开发者高效完成配色任务。该工具支持一键导出为 CSS 样式表,并提供简洁的中文指令交互方式,大大提升开发效率,助力开发者打造美观和谐的用户界面。
|
8月前
|
人工智能 前端开发 JavaScript
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
963 18
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
718 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
701 70
|
JavaScript 前端开发 API
|
人工智能 移动开发 前端开发
WeaveFox:蚂蚁集团推出 AI 前端智能研发平台,能够根据设计图直接生成源代码,支持多种客户端和技术栈
蚂蚁团队推出的AI前端研发平台WeaveFox,能够根据设计图直接生成前端源代码,支持多种应用类型和技术栈,提升开发效率和质量。本文将详细介绍WeaveFox的功能、技术原理及应用场景。
7317 68
WeaveFox:蚂蚁集团推出 AI 前端智能研发平台,能够根据设计图直接生成源代码,支持多种客户端和技术栈
|
人工智能 IDE JavaScript
JetBrains WebStorm 2025.1 发布 - 最智能的 JavaScript IDE
JetBrains WebStorm 2025.1 (macOS, Linux, Windows) - 最智能的 JavaScript IDE
501 6
JetBrains WebStorm 2025.1 发布 - 最智能的 JavaScript IDE
|
前端开发 JavaScript 数据可视化
58K star!这个让网页动起来的JS库,前端工程师直呼真香!
Anime.js 是一款轻量级但功能强大的JavaScript动画引擎,它能够以最简单的方式为网页元素添加令人惊艳的动效。这个项目在GitHub上已经获得58,000+星标,被广泛应用于电商页面、数据可视化、游戏开发等场景。
519 8
|
资源调度 JavaScript 前端开发
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
14336 23
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
962 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡

热门文章

最新文章