首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

javascript promise尽管有promise,但仍会同步执行代码

JavaScript Promise是一种用于处理异步操作的编程模式。尽管Promise可以处理异步操作,但在某些情况下,仍然会同步执行代码。

Promise是一种代表异步操作的对象,它可以有三种状态:pending(进行中)、fulfilled(已完成)和rejected(已拒绝)。当一个Promise对象被创建时,它处于pending状态。当异步操作成功完成时,Promise的状态会从pending变为fulfilled,并返回一个值。当异步操作失败时,Promise的状态会从pending变为rejected,并返回一个错误。

尽管Promise可以处理异步操作,但在某些情况下,仍然会同步执行代码。这是因为Promise的执行顺序是由事件循环机制决定的。当遇到一个Promise时,它会立即执行,并将其回调函数添加到微任务队列中。但是,如果Promise的状态已经是fulfilled或rejected,那么它的回调函数将会被添加到微任务队列中,但不会立即执行。只有当当前的同步代码执行完毕后,事件循环才会检查并执行微任务队列中的回调函数。

因此,尽管Promise可以处理异步操作,但在某些情况下,仍然会同步执行代码。这是因为Promise的执行顺序受到事件循环机制的影响。

推荐的腾讯云相关产品:无

参考链接:

  • Promise - JavaScript | MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JavaScript执行(一):Promise里的代码为什么比setTimeout先执行

当拿到一段 JavaScript 代码时,浏览器或者 Node 环境首先要做的就是;传递给 JavaScript 引擎,并且要求它去执行。...然而,执行 JavaScript 并非一锤子买卖,宿主环境当遇到一些事件时,会继续把一段代码传递给 JavaScript 引擎去执行,此外,我们可能还会提供 API 给 JavaScript 引擎,比如...所以,我们首先应该形成一个感性的认知:一个 JavaScript 引擎会常驻于内存中,它等待着我们(宿主)把 JavaScript 代码或者函数传递给它执行。...在 ES3 和更早的版本中,JavaScript 本身还没有异步执行代码的能力,这也就意味着,宿主环境传递给 JavaScript 引擎一段代码,引擎就把代码直接顺次执行了,这个任务也就是宿主发起的任务...第一个宏观任务中,包含了先后同步执行的 console.log(“a”) 和 console.log(“b”)。

57210

JavaScriptPromise里的代码为什么比setTimeout先执行

当拿到一段 JavaScript 代码时,浏览器或者 Node 环境首先要做的就是;传递给 JavaScript 引擎,并且要求它去执行。...然而,执行 JavaScript 并非一锤子买卖,宿主环境当遇到一些事件时,会继续把一段代码传递给 JavaScript 引擎去执行,此外,我们可能还会提供 API 给 JavaScript 引擎,比如...所以,我们首先应该形成一个感性的认知:一个 JavaScript 引擎会常驻于内存中,它等待着我们(宿主)把 JavaScript 代码或者函数传递给它执行。...在 ES3 和更早的版本中,JavaScript 本身还没有异步执行代码的能力,这也就意味着,宿主环境传递给 JavaScript 引擎一段代码,引擎就把代码直接顺次执行了,这个任务也就是宿主发起的任务...第一个宏观任务中,包含了先后同步执行的 console.log(“a”) 和 console.log(“b”)。

82920

为什么我避免使用asyncawait?

JavaScript中的async/await功能的效用是基于这样的想法:异步代码很难,相比之下,同步代码更容易。...同步代码可能比异步代码更容易处理,同步代码不是异步代码。它们有非常不同的属性。很多时候这不是问题,当它是问题时,就很难识别,因为async/await正好隐藏了显示它的线索。以这段代码为例。...有几个关键的地方,我们必须担心JavaScript同步代码的错误处理。这主要发生在我们把一些东西交给本地API,如JSON.parse,或浏览器功能,如window.localstorage。...让我们假设在我们的同步例子中,save执行了一个可能会抛出的操作。这是非常合理的,因为如果保存到sessionstorage,它可能在序列化或试图访问sessionstorage的过程中抛出。...} llamas`) .then((str) => /ll/.test(str))这都是完全合法的(尽管有点不合理,编造的例子是为了说清楚♂)本文参考Why I avoid async/await,

1.7K42

转:用 Async 函数简化异步代码

Promises 也远非完美。它们一直请求回调,在一些复杂的问题上仍会有些杂乱和一些难以置信的冗余。...生成器可在函数内部停止执行,这意味着可把它们封装在一个多用途的函数中,我们可在代码移动到下一行之前等待异步操作完成。突然你的异步代码可能就开始看起来同步了。 这只是第一步。...,这是因为 then 和给它传递的回调函数增加了很多的额外代码。...使用 async 函数的时候,拒绝被当作错误来传递,这样它们就可以通过 JavaScript 本身支持的错误处理代码来处理。...需要记住的是,async 函数内部的的代码同步运行的,但是它会立即返回一个 Promise,并继续运行外面的代码,比如: var a = doAsyncOp(); // one of the working

60010

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

幸运的是我们的函数是同步的:它是一个简单的乘法,可以很快的得到计算结果。 同时,引擎还分配了全局执行上下文,这是 JavaScript 代码运行的全局环境。...异步JavaScript,回调队列和事件循环 全局内存、执行上下文和调用栈解释了同步 JavaScript 代码在浏览器中的运行方式。然而我们还错过了一些东西。当有异步函数运行时会发生什么?...在完成后执行该函数。 这是用于处理异步和同步代码JavaScript 引擎的大图: JavaScript引擎大图 想象一下,callback() 已准备好执行。...回调地狱和 ES6 的 Promise JavaScript 中的回调函数无处不在。它们用于同步和异步代码。...ES6 Promise 中的错误处理 JavaScript 中的错误处理一直很简单,至少对于同步代码而言。

1.5K30

js异步解决方案的发展历程

引言--JavaScript是一种广泛使用的编程语言,用于开发Web应用程序。在Web开发中,异步编程是一种重要的技术,它允许在执行长时间运行的操作时不阻塞用户界面。...随着JavaScript的发展,异步编程解决方案也在不断演进。本文将探讨JavaScript异步解决方案的发展历程、优缺点以及代码示例。1....优点:可以暂停和恢复执行:可以在异步操作中暂停执行,并在需要时恢复执行。可以使用同步的方式编写异步代码:Generator函数可以使用同步的方式编写异步代码,使代码更易读和维护。...Async/Await使得异步代码看起来像同步代码一样,并且自动处理错误。优点:代码更简洁易读:使用Async/Await可以将异步代码写成类似于同步代码的形式,使得代码更易读和维护。...回调函数简单易懂,容易导致回调地狱;Promise解决了回调地狱问题,但无法取消异步操作;Generator可以暂停和恢复执行需要手动控制迭代器;Async/Await使得异步代码看起来像同步代码一样

20930

ES6之Promise用法详解

2.1 同步与异步 我们知道,JavaScript执行环境是「单线程」。 ...所谓单线程,是指JS引擎中负责解释和执行JavaScript代码的线程只有一个,也就是一次只能完成一项任务,这个任务执行完后才能执行下一个,它会「阻塞」其他任务。这个任务可称为主线程。 ...实际上还有其他线程,如事件触发线程、ajax请求线程等。 这也就引发了同步和异步的问题。...同步模式比较简单,也较容易编写。问题也显而易见,如果请求的时间较长,而阻塞了后面代码执行,体验是很不好的。因此对于一些耗时的操作,异步模式则是更好的选择。...由于定时器是异步的,异步任务会在当前脚本的所有同步任务执行完才会执行。如果同步代码中含有死循环,即将上例的注释去掉,那么这个异步任务就不会执行,因为同步任务阻塞了进程。

1.1K30

✨从延迟处理讲起,JavaScript 也能惰性编程?

传送门 前文回顾 # ✨从历史讲起,JavaScript 基因里写着函数式编程 # ✨从柯里化讲起,一网打 JavaScript 重要的高阶函数 # ✨从纯函数讲起,一窥最深刻的函子 Monad...虽然 JavaScript 本身语言的设计不是惰性求值,并不意味着它不能用惰性的思想来编程~ 从惰性编程的角度来思考问题,可以消除代码中不必要的计算,也可以帮你重构程序,使之能更加直接地面向问题。...比如 JavaScript 的“父亲” Scheme 中就有简单的惰性编程,它有两个特殊的结构,delay 和 force,delay 接收一个代码块,不会立即执行它们,而是将代码和参数作为一个 promise...而 force promise 则会运行这段代码,产生一个返回值; 这里提到 promise?在 JS 中也有 Promise,它是 JS 实现惰性的关键吗?...我们无法知道 Promise 是刚开始执行,或者是快执行完了,还是其它哪个具体执行阶段;内部的异步任务就已经启动了,执行无法中途取消;这些问题也是面试中常考的 Promise 的缺点有哪些。

62820

并发模型与事件循环

#constructor 构造函数 #原型链&继承 #Promise #函数生成器 #async...await #并发模型与事件循环 JavaScript的并发模型基于事件循环。 先同步,后异步。...#不阻塞 MDN声称JavaScript“永不阻塞”,这当然是不对的,例如alert()与同步XHR的场景,如此声称有它的理由。...JavaScript中I/O通常采用事件回调的形式完成,这意味着I/O不会影响其余代码执行。 #添加消息 事件需要绑定监听器以被监听,否则事件将丢失。...#同步代码 JavaScript同步执行代码可以理解成第一条消息的处理函数,在它执行完前,不会有其他消息被处理。...then(_ => { console.log(3) }) console.log(2) Promise同步代码Promise.then才是异步代码,所以1,2的顺序是毫无疑问的。

72620

事件循环Event Loop

---- 1.关于javascript javascript是一门单线程语言,在最新的HTML5中提出了Web-Worker,javascript是单线程这一核心仍未改变。...(不管是什么新框架新语法糖实现的所谓异步,其实都是用同步的方法去模拟的) ---- 2.javascript事件循环 事件循环是js实现异步的一种方法,也是js的执行机制。...,但是他被放到了宏任务的eventqueue里面,(2)往下检查看有没有微任务,发现Promise回调函数内的代码同步的(微任务)输出2 (3)then函数把他放入了微任务序列。...4.async2执行完毕,将await async2 后面的代码加入到 微任务队列async1 end'); 5、继续执行,new Promise, 同步输出“promise1”。...10 async1 end setTimeout new promise的操作就跟你 new 一个普通函数没区别,所以这一句其实是宏任务,后面的then是微任务 resolved后的promise

98810

处理异步事件的三种方式

比如我们去银行办理业务,在窗口前排队就是同步执行,而拿到号码先去做别的事情的就是异步执行;通过 Event Loop 的特性,在 JavaScript 处里异步事件可说是轻而易举的 那么在 JavaScript...正是通过微任务队列来驱动它的;微任务队列的触发时机是在栈被清空时,JavaScript 引擎会先确认微任务队列有没有东西,有的话就优先执行,直到清空后才从队列拿出新任务到栈上。...在 ES8 中规范了新的 async/await,虽然只是 Promise 和 Generator Function组合在一起的语法糖,通过 async/await 便可以将异步事件用同步语法来处理,...,再用 await 关键字调用,可以看到结果会是同步执行的先出现 bar,再出现 foo,也就是开头提到的将异步事件写成同步处理。...: 总结 本文简单介绍了 JavaScript 处理异步的三种方式,并通过一些简单的例子说明代码执行顺序;呼应前面提到的事件循环,再其中加入了微任务队列的概念。

83750

《现代Javascript高级教程》JavaScript中的异步编程与Promise

当主线程空闲时(也就是同步任务都执行完毕),便会去看任务队列里有没有任务,如果有,便将其取出执行;没有的话,则继续等待。...事件循环的顺序,决定了 JavaScript 代码执行顺序。...过程如下: 执行同步代码,这属于宏任务 执行栈为空,查询是否有微任务需要执行 执行所有微任务 必要的话渲染UI 然后开始下一轮 Event loop,执行宏任务中的异步代码 代码示例如下: console.log...requestAnimationFrame 的位置在事件循环中的具体位置是视浏览器的实现而定,一般来说,它在宏任务执行完,渲染之前,这使得其可以获取到最新的布局和样式信息。...Promise 主要解决了两类问题: 异步操作的一致性问题:无论异步操作是同步完成还是异步完成,使用 Promise 对象的 then 方法都可以以同样的方式进行处理。

19720

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

异步和分块——程序的分块执行 一开始学习javascript的时候, 我对异步的概念一脸懵逼, 因为当时百度了很多文章,很多各种文章不负责任的把笼统的描述混杂在一起,让我对这个 JS中的重要概念难以理解...后来我发现,其实理解异步最主要的一点,就是记住: 我们的程序是分块执行的。 分成两块, 同步执行的凑一块, 异步执行的凑一块,搞完同步,再搞异步 废话不多说, 直接上图:  图1 ? 图2  ?..., 你现在在ajax执行结束前,你都没有办法去doOtherThing,去做接下来所有的交互程序了。...: 假设ajax的执行能像一个同步执行的foreach函数的执行那样迅速, javascript又何苦对它做一些异步处理呢?...链式 我们上面说了, 纯回调的一大痛点就是“金字塔回调地狱”, 这种“嵌套风格”的代码丑陋难懂,Promise就可以把这种“嵌套”风格的代码改装成我们喜闻乐见的“链式”风格 因为then函数是可以链式调用的

1.1K80

JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 asyncawait 更好地编码方式!

注意:实际上可以设置同步Ajax请求,永远不要那样做。如果设置同步Ajax请求,应用程序的界面将被阻塞——用户将无法单击、输入数据、导航或滚动。这将阻止任何用户交互,这是一种可怕的做法。...以下是同步 Ajax 地,但是请千万不要这样做: ? 这里使用Ajax请求作为示例,你可以让任何代码块异步执行。...代码(就像上例讨论的setTimeout),但在ES6之前,JavaScript本身实际上从来没有任何内置异步的概念,JavaScript引擎在任何给定时刻只执行一个块。...例如,当 JavaScript 程序发出 Ajax 请求从服务器获取一些数据时,在函数(“回调”)中设置“response”代码,JS引擎告诉宿主环境:"我现在要推迟执行当完成那个网络请求时,会返回一些数据...例如,如果在一个程序中设置了一个断点,然后阻塞并使用调试快捷方式(如“停止”),调试器将不会移动到下面,因为它只“逐步”执行同步代码

3.1K20

异步JavaScript:从回调地狱到异步和等待

这种模式使代码更容易阅读,与“不要重复自己”(DRY)原则相去甚远。仍然有太多的情况下,你不得不重复相同的代码段来正确管理应用程序的流程。...这就是为什么像蓝鸟和Q这样的JavaScript Promise库获得如此多的关注。它们提供了一种对语言本身尚未提供的异步请求执行常见操作的方法。...带有两个回调函数的方法,并且它Promise自己执行方法中的操作。...它们允许我们编写Promise基于代码代码,就好像它是同步的,但是不会阻塞主线程,因为此代码示例演示了: const verifyUser = async function(username, password...它们允许我们编写基于Promise代码,就好像它是同步的,但不阻塞主线程。 什么是回调地狱? 在JavaScript中,回调地狱是代码中的一种反模式,这是由于异步代码结构不良造成的。

3.6K10

JavaScript 异步编程

异步编程方案有哪些 JavaScript 异步编程方案各有什么优缺点 回答关键点 阻塞 事件循环 回调函数 JavaScript 是一种同步的、阻塞的、单线程的语言,一次只能执行一个任务。...浏览器定义了非同步的 Web APIs,将回调函数插入到事件循环,实现异步任务的非阻塞执行。...6. async/await async/await 属于 ECMAScript 2017 JavaScript 版的一部分,使异步代码更易于编写和阅读。通过使用它们,异步代码看起来更像是同步代码。...async/await 与 Promise 一样,是非阻塞的。 async/await 使得异步代码看起来像同步代码。...async/await 也存在问题:await 关键字会阻塞其后的代码,直到 Promise 完成,就像执行同步操作一样。它可以允许其他任务在此期间继续运行,自己的代码会被阻塞。

94200

JavaScript 异步编程

博客地址:https://ainyi.com/96 众所周知,JavaScript 是单线程的,异步在 js 中很常见,那么简单来介绍一下异步编程 同步编程和异步编程 同步编程,计算机一行一行按顺序依次执行代码...;那么 JavaScript 单线程的异步编程可以实现多任务==并发执行== 重点实现 js 异步的方式,就是==事件循环==,之前写过关于事件循环的例子,可看:JavaScript 事件循环、异步和同步...事件循环 事件循环涉及到两个概念:消息队列、任务 消息队列:也叫任务队列,存储待处理消息及对应的回调函数或事件处理程序 任务:js 区分同步任务和异步任务,代码执行就是在执行任务,也就是对应同步和异步的代码块...首先 JavaScript同步任务是进入主线程的执行执行;异步任务则进入==消息队列(任务队列)==,一个存储着待执行任务的队列,严格按照时间先后顺序执行,排在队头的任务将会率先执行,而排在队尾的任务会最后执行...,改为 true 时为同步执行 Promise promise 就经常使用了,平常使用 axios 作为请求接口的方式,就是封装了 Promise

58430

Javascript中的异步编程

由于是异步的,主程序并不会等到两秒之后才跑setTimeout后面的代码,而是立即执行,所以先输出了End...,2秒之后,注册的回调函数运行了,输出了in progress。...A AB 回调函数是Javascript异步编程最基本的编写方式,但是容易遇到回调地狱的问题。所谓回调地狱,其实就是回调嵌套的太多,导致了代码难以阅读和编写。..., promise2, promise3将会一起执行,如果都成功,我们可以在then函数中对所有的结果一起进行处理。...所以,async函数的写法其实更像是同步函数。值得注意的是,这样的写法虽然更加直观明了,Javascript的性能主要是靠异步操作来提升的,如果没有必要,是不建议使用await来等待的。...无论技术如何发展,如何变化,万变不离其宗,基本原理始终未变。 阅读原文

88100
领券