首页
学习
活动
专区
圈层
工具
发布

【javascript】异步编年史,从“纯回调”到Promise

就是因为它如此耗时, 所以javascript“审时度势”, 拿出了“异步”的这一把刷子,来解决问题 正因为有“非阻塞”的刚需, javascript才会对ajax等一概采用异步处理 “因为要非阻塞,...所以要异步”,这就是我个人对异步/同步和阻塞/非阻塞关系的理解 可能你没有注意到,回调其实是存在很多问题的 没错,接下来的画风是这样子的: ?...回调存在的问题 回调存在的问题可概括为两类: 信任问题和控制反转 可能你比较少意识到的一点是:我们是无法在主程序中掌控对回调的控制权的。 例如: ajax( ".....这让我们的回调“任人宰割” 然后上线后的一天, 数据分析公司的一个隐蔽的bug终于显露出来, 让其中一个原本只执行一次的payWithYourMoney执行了5次, 这让那个网上商城的客户极为恼怒, 并投诉了你们公司...没办法在复杂的异步场景中很好地表达代码逻辑 哎呀这里我就不说废话了: 在异步中如果你总是依赖回调的话,很容易就写出大家都看不懂, 甚至自己过段时间也看不懂的代码来, 嗯, 就这样 看个例子,下面的doA到doF

1.4K80
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JavaScript引擎是如何工作的?从调用栈到Promise你需要知道的一切

    这时,你应该了解到当浏览器加载某些 JavaScript 代码时,引擎会逐行读取并执行以下步骤: 使用变量和函数声明填充全局内存(堆) 将每个函数调用送到调用栈 创建一个全局执行上下文,其在中执行全局函数...幸运的是,JavaScript 引擎非常智能,并且能在浏览器的帮助下解决问题。 当我们运行异步函数时,浏览器会接受该函数并运行它。...我们现在要关注的是 ES6 Promise。 ES6 Promise 是对 JavaScript 语言的补充,旨在解决可怕的回调地狱。但 Promise 是什么?...Promise API 提供了一系列将 Promise 组合在一起的方法。其中最有用的是Promise.all,它接受一系列 Promise 并返回一个Promise。...异步的进化:从 Promise 到 async/await JavaScript 正在快速发展,每年我们都会不断改进语言。

    1.8K30

    JavaScript执行机制

    第一轮loop,继续执行主代码块,进行new Promise,执行Promise的executor,输出步骤7,并修改Promise为完成态。...第一轮loop,继续执行Promise.then,注册微任务步骤8并压入微任务队列。第一轮loop,继续执行输出步骤9。...第一轮loop,执行主代码块的Promise.then,输出步骤8,继续清空微任务队列,const v2 = testAsync(),此时v2拿到了testAsync函数的返回值,继续执行并输出步骤5,...但是,如果回调已使用 setImmediate()调度过,并且轮询阶段变为空闲状态,则它将结束此阶段,并继续到检查阶段而不是继续等待轮询事件。...任何时候在给定的阶段中调用 process.nextTick(),所有传递到 process.nextTick() 的回调将在事件循环继续之前解析。

    98033

    前端面试中小型公司都考些什么

    ⽤户浏览器接收到响应后解析执⾏,前端 JavaScript 取出 URL 中的恶意代码并执⾏。恶意代码窃取⽤户数据并发送到攻击者的⽹站,或者冒充⽤户的⾏为,调⽤⽬标⽹站接⼝执⾏攻击者指定的操作。...JavaScript 的加载、解析与执行会阻塞文档的解析,也就是说,在构建 DOM 时,HTML 解析器若遇到了 JavaScript,那么它会暂停文档的解析,将控制权移交给 JavaScript 引擎...,等 JavaScript 引擎运行完毕,浏览器再从中断的地方恢复继续解析文档。...也就是说,在这种情况下,浏览器会先下载和构建 CSSOM,然后再执行 JavaScript,最后再继续文档的解析。...;遇到Promise,执行代码,打印出3,遇到resolve,将其加入到微任务队列;遇到第二个定时器,加入到宏任务队列;遇到第三个定时器,加入到宏任务队列;继续执行script代码,打印出8,第一轮执行结束

    89230

    Promise 和 AsyncAwait的区别

    在 JavaScript 中,promises 和 async/await 是处理异步操作的两种不同方法。但它们之间关系密切。 Promise Promise 是最终导致异步操作完成或失败的对象。...await 关键字用于在继续执行函数之前等待承诺的解析。 await 关键字只能在 async 函数中使用。...当创建 Promise 并启动异步操作时,创建 Promise 后的代码会继续同步执行。当 Promise 被解析或拒绝时,附加的回调函数会被添加到微任务队列中。...另一方面,在使用 async/await 时, await 关键字会使 JavaScript 引擎暂停执行 async 函数,直到 Promise 解析或被拒绝。...当 async 函数等待 Promise 解析时,它不会阻塞调用栈,因此可以执行任何其他同步代码。一旦 Promise 解析完毕, async 函数将继续执行,并返回 Promise 的结果。

    58810

    阿里前端常考面试题

    JS 引擎 相互独立,但又工作在同一线程(主线程) JS 代码调用 DOM API 必须 挂起 JS 引擎、转换传入参数数据、激活 DOM 引擎,DOM 重绘后再转换可能有的返回值,最后激活 JS 引擎并继续执行若有频繁的...大致过程如图所示: 注意: 这个过程是逐步完成的,为了更好的用户体验,渲染引擎将会尽可能早的将内容呈现到屏幕上,并不会等到所有的html 都解析完成之后再去构建和布局 render 树。...在中间⼈攻击中,攻击者可以拦截通讯双⽅的通话并插⼊新的内容。攻击过程如下:客户端发送请求到服务端,请求被中间⼈截获服务器向客户端发送公钥中间⼈截获公钥,保留在⾃⼰⼿上。...JavaScript 的加载、解析与执行会阻塞文档的解析,也就是说,在构建 DOM 时,HTML 解析器若遇到了 JavaScript,那么它会暂停文档的解析,将控制权移交给 JavaScript 引擎...,等 JavaScript 引擎运行完毕,浏览器再从中断的地方恢复继续解析文档。

    85520

    带你了解浏览器工作过程

    生成DOM Tree,并保存在浏览器内存中undefined-- 同时开启一个预解析线程,用来分析 HTML 文件中包含的Javascript、 CSS 、Img等资源,通知网络进程提前加载这些资源 解析遇到...引擎执行脚本完成后,HTML再继续解析 JavaScript 脚本是依赖样式表的,会先等CSS文件加载并解析完成再执行,因此Javascript对元素的样式是最终生效的 javascript 会阻塞HTML...解析和页面渲染 css解析和HTML解析并行,不会阻塞HTML解析,但是会阻塞页面渲染(但是Javascript执行,会导致CSS的解析增加HTML解析的时间) 第二步,生成Layout Tree(布局树...执行机制 (一)JavaScript代码执行流程 第一步,代码编译:JavaScript 引擎对代码进行编译,并保存在内存中 编译结果为两部分:执行上下文、可执行代码 showName();//函数showName...,创建全局执行上下文,压入调用栈,并全局的执行可执行代码 执行上下文栈.png 第二步,执行到addAll调用时,生成addAll函数的执行上下文,压入上下文,并执执行addAll函数内部的可执行代码

    2K40

    关于 JavaScript 中的 Promise

    Part 2创建 Promise 后,可以使用该方法附加一个回调函数,在JavaScript中,Promise对象的.then()方法用于附加一个或多个回调函数,以处理Promise对象的解析值(resolved...对象myPromise,并使用.then()方法来附加两个回调函数:一个用于处理解析值的回调函数,另一个用于处理拒绝值的回调函数。...如果Promise对象在执行过程中被成功解析(resolved),第一个回调函数将被调用,并传递解析值作为参数。...then() 方法返回一个新的 Promise 对象,可以继续进行链式调用。...Promise 取消在现代 JavaScript 中 - 不可以,一旦 Promise 创建,就无法取消它。它将执行其代码并解析或拒绝,并且没有内置的方法来取消操作。

    1.4K62

    2025年 JavaScript 面试题的130道题目及其答案解析,万字长文,持续更新....

    什么是异步编程,如何在 JavaScript 中实现? 答案: 异步编程允许程序在等待某些操作完成时继续执行其他操作,以提高效率。...什么是 JavaScript 中的 Promise? 答案: Promise 是表示异步操作的对象,可能在未来的某个时间点完成并返回结果。...答案: Promise.any() 方法接受一个 Promise 可迭代对象并返回一个 Promise,该 Promise 解析为第一个成功的 Promise 的结果。...解析: 如果所有 Promise 都被拒绝,则返回的 Promise 将被拒绝,并返回一个 AggregateError。...答案: Promise.all() 方法接受一个 Promise 可迭代对象,并返回一个 Promise,该 Promise 解析为所有输入的 Promise 的结果数组。

    1.8K01

    渲染数学公式之--MathJax

    2.自定义渲染引擎:有些库可能会使用自己的渲染引擎,绕过浏览器的标准渲染流程,以实现更高的性能或特定的视觉效果。前端渲染公式有哪些库在前端渲染公式时,有多个渲染库可以选择。...采用纯JavaScript实现,需要在客户端逐个解析和排版公式。兼容性KaTeX:对现代浏览器的支持较好,但在一些旧版浏览器上可能存在兼容性问题。不支持MathML输出。...服务器端渲染KaTeX:支持服务器端渲染,可以将公式预渲染成静态HTML,加快页面加载速度并改善SEO。...它返回一个 Promise 对象,当数学公式排版和渲染完成时,Promise 将被解析(resolve)。这使得你可以在数学公式渲染完成后执行其他操作,例如在公式显示后执行动画效果。...这意味着在调用 MathJax.typeset() 后,数学公式会立即更新,而不需要等待 Promise 解析。

    1.4K31

    《现代Javascript高级教程》异步的终极解决方案

    背景 在深入讨论 async/await 之前,我们需要了解一下 JavaScript 的单线程和非阻塞的特性。JavaScript 是单线程的,也就是说在任何给定的时间点,只能执行一个操作。...为了解决这个问题,JavaScript 引入了回调函数和后来的 Promise,用来管理这些异步操作。 然而,回调函数和 Promise 还是存在一些问题。...在这个过程中,async函数会暂时释放线程的控制权,使其他代码可以继续执行。 await关键字:用于暂停async函数的执行,等待一个Promise对象的完成,并返回其解析的值。...当使用await表达式时,代码的执行会暂停,直到Promise对象被解析或拒绝。...最后,我们创建了一个 asyncToGenerator 函数,该函数接受一个 Generator 函数作为参数,并返回一个新的 Promise,这个 Promise 的解析值就是 Generator 函数的返回值

    35420

    👣探索浏览器的秘密👣

    从你输入url到页面渲染大致如下步骤: DNS解析IP地址 建立TCP连接 发送http请求 关闭TCP连接 浏览器渲染(只对本项重点叙述) 渲染引擎(GUI) 游览器渲染流程大致如下: GUI将HTML...合成线程将图层分图块,并栅格化将图块转换成位图。 合成线程发送绘制图块命令给浏览器进程。浏览器进程根据指令生成页面,并显示到显示器上。...,执行其中的同步代码1 再遇到resolve('success'), 将promise的状态改为了resolved并且将值保存下来 继续执行同步代码2 跳出promise,往下执行,碰到promise.then...其实有很多人会混淆很多概念比方任务队列和微任务队列、甚至同步任务、异步任务与宏任务、微任务混淆到一起,实际在还没有Promise之前,JS是不能发起异步请求的,那个时候只有同步任务。...浏览器下载css文件并解析,确认没有内嵌的额外资源(通过import)需要记载。 浏览器在未下载完js文件前,继续组赛渲染。 浏览器下载完js文件并解析,确保没有额外的资源需要加载。

    94640

    代码片段分享:7个实用的asyncawait代码片段,轻松掌握JavaScript异步操作

    在JavaScript的世界里,异步编程经历了从回调函数到Promises,再到如今广泛使用的async/await语法的演变。...示例代码 在实际开发中,比如你需要一次性上传多个文件到服务器,但如果同时上传太多文件,可能会耗尽系统资源,导致性能下降甚至崩溃。...任务完成后,如果发现还有未探索的路径(子节点),探险队就会深入这些路径,继续他们的探险旅程,直到把整片森林探查完毕。...不过,别担心,我们可以通过“工厂模式”巧妙地绕过这个限制,实现类实例的异步初始化。这种方法就像是定制产品的工厂,先处理好所有原材料(异步数据),再制造出符合你需求的产品(类实例)。...这个函数内部使用了Promise来包装setTimeout,并配合await来实现异步等待。在指定的时间过去后,fn回调函数被调用,执行你所定义的操作。

    53010

    JavaScript中的Promises

    你有没有在JavaScript中遇到过promises并想知道它们是什么?它们为什么会被称为promises呢?它们是否和你以任何方式对另一个人做出的承诺有关呢?...通过类比会更好地解析JavaScript promise的概念,所以我们来这样做(类比),使其概念更加清晰。 想象一下,你准备下周为你的侄女举办生日派对。...你意识到如果Jeff信守诺言,并在聚会时买来一个黑森林蛋糕,你就可以按照计划继续派对了。 如果Jeff确实买来了蛋糕,在JavaScript中,我们说这个promise是实现(resolved)了。...const promise = new Promise((resolve, reject) => { /* Do something here */ }) 如果resolve被调用,promise成功并继续进入...(number => console.log(number)) // 27 如果reject被调用,promise失败并继续进入catch链式(操作)。

    1.2K20

    【译】JavaScript中的Promises

    你有没有在JavaScript中遇到过promises并想知道它们是什么?它们为什么会被称为promises呢?它们是否和你以任何方式对另一个人做出的承诺有关呢?...通过类比会更好地解析JavaScript promise的概念,所以我们来这样做(类比),使其概念更加清晰。 想象一下,你准备下周为你的侄女举办生日派对。...你意识到如果Jeff信守诺言,并在聚会时买来一个黑森林蛋糕,你就可以按照计划继续派对了。 如果Jeff确实买来了蛋糕,在JavaScript中,我们说这个promise是实现(resolved)了。...成功并继续进入then链式(操作)。...(number => console.log(number)) // 27 复制代码 如果reject被调用,promise失败并继续进入catch链式(操作)。

    1.8K20

    浏览器原理学习笔记04—浏览器中的页面事件循环系统

    此外,消息队列还包含很多页面相关事件,如 JavaScript 执行、解析 DOM、样式计算、布局计算、CSS 动画等。更多事件在3、6两节中继续介绍。...3.2.3 微任务的执行 在当前宏任务中的 JavaScript 快执行完成时(JavaScript 引擎准备退出全局执行上下文并清空调用栈时),JavaScript 引擎会检查全局执行上下文中的微任务队列并按序执行...关于检查点: 除了退出,还有其他检查点,但不重要 [3156zmceb1.png] 上图执行一个 ParseHTML 宏任务过程中遇到 JavaScript 脚本,暂停解析流程并进入到 JavaScript...(onResolve) Promise 将回调函数的返回值穿透到最外层 通过将回调函数中创建的 Promise 对象返回到最外层可以摆脱嵌套循环。...父协程需要调用 `promise.then来监控 promise 状态的改变。接下来继续执行父协程打印 3。

    1.9K168

    中级前端面试题(附答案)

    然而,存在一个问题,JavaScript 脚本执行时可能在文档的解析过程中请求样式信息,如果样式还没有加载和解析,脚本将得到错误的值,显然这将会导致很多问题。...所以如果浏览器尚未完成 CSSOM 的下载和构建,而我们却想在此时运行脚本,那么浏览器将延迟 JavaScript 脚本执行和文档的解析,直至其完成 CSSOM 的下载和构建。...也就是说,在这种情况下,浏览器会先下载和构建 CSSOM,然后再执行 JavaScript,最后再继续文档的解析。...大致过程如图所示: 注意: 这个过程是逐步完成的,为了更好的用户体验,渲染引擎将会尽可能早的将内容呈现到屏幕上,并不会等到所有的html 都解析完成之后再去构建和布局 render 树。...DNS完整的查询过程DNS服务器解析域名的过程:首先会在浏览器的缓存中查找对应的IP地址,如果查找到直接返回,若找不到继续下一步将请求发送给本地DNS服务器,在本地域名服务器缓存中查询,如果查找到,就直接将查找结果返回

    1.3K10
    领券