《智能前端技术与实践》——第 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()方法所传入 的值。



相关文章
|
9天前
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
30 1
|
12天前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
18天前
|
前端开发 JavaScript 测试技术
前端测试技术中,如何提高集成测试的效率?
前端测试技术中,如何提高集成测试的效率?
|
18天前
|
监控 前端开发 JavaScript
前端工程化和传统前端开发的区别是什么?
前端工程化相比传统前端开发,在开发模式、代码组织与管理、构建与部署流程、团队协作、性能优化以及技术选型等方面都有了显著的改进和提升,能够更好地应对现代前端应用开发的复杂性和高要求。
|
11天前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
22 5
|
18天前
|
前端开发 JavaScript 开发者
前端小白逆袭记:从零开始,如何快速掌握前端开发精髓?
本文从一个前端小白的视角,分享了快速掌握前端开发核心技能的逆袭之路。通过学习HTML、CSS和JavaScript,逐步接触前端框架如Bootstrap、Vue.js和React,克服挑战,最终实现从入门到精通的蜕变。
24 4
|
18天前
|
移动开发 前端开发 JavaScript
惊!这些前端技术竟然能让你的网站在移动端大放异彩!
随着互联网技术的发展,移动设备成为主要的上网工具。本文介绍了几种关键的前端技术,包括响应式设计、图片优化、字体选择、HTML5和CSS3的应用、性能优化及手势操作设计,帮助开发者提升网站在移动端的显示效果和用户体验。示例代码展示了如何实现简单的双向绑定功能。
26 3
|
18天前
|
数据采集 前端开发 安全
前端测试技术
前端测试是确保前端应用程序质量和性能的重要环节,涵盖了多种技术和方法
|
23天前
|
编解码 前端开发 JavaScript
前端界的黑科技:掌握这些技术,让你的网站秒变未来感十足!
【10月更文挑战第31天】前端技术日新月异,黑科技层出不穷,让网页更加美观、交互更加丰富。本文通过响应式布局与媒体查询、前端框架与组件化开发等案例,展示这些技术如何让网站充满未来感。响应式布局使网站适应不同设备,前端框架如React、Vue则提高开发效率和代码质量。
34 3
|
23天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。