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



相关文章
|
18天前
|
前端开发 JavaScript 关系型数据库
从前端到后端:构建现代化Web应用的技术探索
在当今互联网时代,Web应用的开发已成为了各行各业不可或缺的一部分。从前端到后端,这篇文章将带你深入探索如何构建现代化的Web应用。我们将介绍多种技术,包括前端开发、后端开发以及各种编程语言(如Java、Python、C、PHP、Go)和数据库,帮助你了解如何利用这些技术构建出高效、安全和可扩展的Web应用。
|
1月前
|
XML 前端开发 JavaScript
AJAX 前端开发利器:实现网页动态更新的核心技术
**AJAX** 允许网页在不刷新的情况下更新内容,实现异步与服务器交换数据。通过JavaScript的XMLHttpRequest对象,可发送和接收数据。当用户触发事件(如点击),函数向服务器发送GET请求,服务器响应后更新指定HTML部分。AJAX并非编程语言,而是利用浏览器内置对象、JavaScript和DOM技术。核心是XMLHttpRequest对象,它有多种方法(如`open()`和`send()`)和属性(如`onreadystatechange`、`readyState`和`status`)来处理请求和响应。
58 2
AJAX 前端开发利器:实现网页动态更新的核心技术
|
1月前
|
机器学习/深度学习 前端开发 搜索推荐
未来趋势下的前端开发技术探索
随着人工智能和物联网技术的快速发展,前端开发领域也面临着新的挑战和机遇。本文将探讨未来趋势下前端开发技术的发展方向和应用场景,为广大前端开发者提供启示与思路。
|
1天前
|
机器学习/深度学习 人工智能 前端开发
探索未来:2024年前端技术趋势解读
探索未来:2024年前端技术趋势解读
12 4
|
2天前
|
前端开发 JavaScript UED
Web前端开发:探索技术与艺术的交融
Web前端开发:探索技术与艺术的交融
8 1
|
2天前
|
前端开发 JavaScript UED
前端技术:引领数字时代的交互之美
前端技术:引领数字时代的交互之美
|
2天前
|
XML 前端开发 JavaScript
前端技术的演变与实战应用
前端技术的演变与实战应用
|
5天前
|
JavaScript 前端开发 UED
深入解析JavaScript原生操作DOM技术
【4月更文挑战第22天】本文深入探讨JavaScript原生DOM操作技术,包括使用`getElement*`方法和CSS选择器获取元素,借助`createElement`与`appendChild`动态创建及插入元素,修改元素内容、属性和样式,以及删除元素。通过掌握这些技术,开发者能实现页面动态交互,但应注意避免过度操作DOM以优化性能和用户体验。
|
14天前
|
前端开发 算法 JavaScript
如何优化前端性能:探索图片压缩与延迟加载技术
本文深入探讨了前端性能优化中的关键问题:图片压缩与延迟加载技术。通过介绍图片压缩的原理和方法,并结合实例说明了如何有效减少图片大小、提升加载速度;同时,详细解析了延迟加载技术的实现原理及其在提高页面加载性能中的作用,为前端开发者提供了实用的优化方案。
|
25天前
|
人工智能 前端开发 JavaScript
【前端设计】HTML+CSS+JavaScript基本特性
【前端设计】HTML+CSS+JavaScript基本特性