JavaScript await 行为深度解析:同步异常与异步流程控制

JavaScript await 行为深度解析:同步异常与异步流程控制

本文深入探讨了 JavaScript 中 async/await 的核心机制,特别聚焦于 await 对同步抛出异常和异步返回值的不同处理方式。我们将解析 await 如何将操作数转换为 Promise,以及当非 async 函数在 Promise 创建前抛出错误时,为何 await 不会暂停执行,从而揭示 await 行为背后的同步与异步流转逻辑,帮助开发者更精确地理解和控制异步代码。

理解 await 的核心机制:Promise 化

await 关键字是 javascript 异步编程中的强大工具,它允许我们以同步的方式编写异步代码。然而,await 的行为并非总是直观的,尤其是在处理同步抛出的错误时。理解其核心机制是关键:await 总是尝试将其操作数转换为一个 promise。根据 mdn 文档,await expression 的行为类似于 promise.resolve(expression),它会等待这个 promise 解决(无论是 fulfilled 还是 rejected)。

这意味着,await 只有在成功地将操作数“包装”成一个 Promise 后,才会暂停当前 async 函数的执行。如果在此之前发生了错误,那么 await 机制可能就不会按预期触发。

场景一:非 async 函数同步抛出异常

当 await 的操作数是一个普通的(非 async)函数,并且这个函数在执行过程中立即抛出错误时,await 的暂停行为将不会发生。

示例代码:

async function load(closure) {  try {    // 尝试等待 closure 的结果    await closure();  } catch (error) {    console.log("error caught in load function");  } finally {    console.log("finally block executed");  }}console.log("--- 场景一:非 async 函数同步抛错 ---");load(() => {  throw new Error("Synchronous error from closure"); // closure 立即抛出错误});console.log("hello from global scope");

预期输出:

立即学习“Java免费学习笔记(深入)”;

--- 场景一:非 async 函数同步抛错 ---error caught in load functionfinally block executedhello from global scope

行为解析:

在此场景中,closure() 是一个同步函数,它在执行时立即抛出了一个错误。这个错误发生在 await 能够将 closure() 的返回值(如果 closure 返回了值的话)包装成 Promise 之前。由于 closure() 根本没有返回任何值,也没有机会形成一个 Promise,await 实际上没有接收到任何 Promise 来等待。因此,load 函数的执行流程没有被暂停,错误被 try…catch 块同步捕获,finally 块也同步执行。随后,控制流立即回到事件循环,console.log(“hello from global scope”) 在 load 函数的微任务队列被调度之前执行。

场景二:非 async 函数同步返回一个值

如果 await 的操作数是一个普通的(非 async)函数,并且这个函数同步返回一个值,await 的暂停行为会按预期发生。

示例代码:

async function load(closure) {  try {    await closure(); // closure 同步返回一个值  } catch (error) {    console.log("error caught in load function");  } finally {    console.log("finally block executed");  }}console.log("n--- 场景二:非 async 函数同步返回值 ---");load(() => {  return 1; // closure 返回一个值});console.log("hello from global scope");

预期输出:

立即学习“Java免费学习笔记(深入)”;

--- 场景二:非 async 函数同步返回值 ---hello from global scopefinally block executed

行为解析:

当 closure() 同步返回一个值 1 时,await 会将这个值通过 Promise.resolve(1) 隐式地转换为一个已解决的 Promise。此时,await 会暂停 load 函数的执行,并将 load 函数中 await 之后的所有代码(包括 finally 块)放入微任务队列。因此,主线程的 console.log(“hello from global scope”) 会立即执行,之后才轮到微任务队列中的 finally block executed。

场景三:async 函数或返回 Promise 的函数抛出/拒绝

async 函数总是返回一个 Promise。即使它内部抛出错误,这个错误也会导致它返回一个被拒绝的 Promise。同样,如果一个普通函数显式地返回一个被拒绝的 Promise,await 也会处理它。

示例代码:

async function load(closure) {  try {    await closure(); // closure 是 async 函数或返回 Promise 的函数  } catch (error) {    console.log("error caught in load function");  } finally {    console.log("finally block executed");  }}console.log("n--- 场景三:async 函数抛错 ---");load(async () => {  throw new Error("Asynchronous error from async closure"); // async 函数抛出错误});console.log("hello from global scope");console.log("n--- 场景四:同步函数返回 rejected Promise ---");load(() => {  return Promise.reject("Manually rejected Promise"); // 同步函数返回一个被拒绝的 Promise});console.log("hello from global scope");

预期输出:

立即学习“Java免费学习笔记(深入)”;

--- 场景三:async 函数抛错 ---hello from global scopeerror caught in load functionfinally block executed--- 场景四:同步函数返回 rejected Promise ---hello from global scopeerror caught in load functionfinally block executed

行为解析:

无论是 async 函数内部抛出错误(导致其返回一个被拒绝的 Promise),还是普通函数显式地返回一个 Promise.reject(),await 接收到的都是一个 Promise。在这种情况下,await 会等待这个 Promise 的状态确定(无论是解决还是拒绝),并暂停当前 async 函数的执行。因此,主线程的 console.log(“hello from global scope”) 仍然会先执行,然后 await 之后的 catch 块和 finally 块才会在微任务队列中被调度执行。

总结与注意事项

通过以上分析,我们可以得出以下关键点:

await 的核心规则: await 只有在操作数是一个 Promise(或能被 Promise.resolve() 转换为 Promise)时,才会暂停当前 async 函数的执行。同步错误 vs. 异步错误处理:当一个非 async 函数在执行过程中立即抛出错误,且这个错误发生在任何值被返回或 Promise 被创建之前,await 机制不会被触发,async 函数不会暂停,错误会被同步捕获。这种情况下,await 表达式实际上从未有机会“等待”任何东西。当一个函数(无论是 async 函数还是返回 Promise 的普通函数)返回一个 Promise(无论是解决的还是拒绝的),await 都会等待这个 Promise 的解决,并暂停当前 async 函数的执行,将后续代码放入微任务队列。执行顺序: 理解 JavaScript 的事件循环和微任务队列对于预测 async/await 的执行顺序至关重要。await 导致的暂停会将后续代码推迟到当前宏任务执行完毕后的下一个微任务阶段。代码健壮性: 在编写异步代码时,应清楚地知道所调用的函数是同步的还是异步的,以及它们在何种情况下可能抛出错误。这有助于避免意外的同步行为,并确保错误处理逻辑能够按预期工作。特别是在处理可能同步也可能异步执行的第三方回调函数时,需要格外注意这些细节。

理解这些细微差别对于编写健壮、可预测的异步 JavaScript 代码至关重要。

以上就是JavaScript await 行为深度解析:同步异常与异步流程控制的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/139361.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月30日 19:28:46
下一篇 2025年11月30日 19:59:16

相关推荐

  • 比特币飙升超过$ 108K,本周新高?

    为全新一周的课程确立积极态势,加密货币市场今日展现出稳健的上行趋势 加密货币市场在全新一周开始之际展现出乐观格局,今日整体走势持续向上攀升。受机构投资者兴趣回升及宏观经济动态影响,市场参与者正密切关注行情变化。 比特币突破108,000美元关口,继续稳步上涨。随着WTI原油价格走高,交易者目前将目光…

    2025年12月8日
    000
  • BlockDag:从启动到聚光灯,筹集了2.9亿美元

    在2025年,视觉效果、合作伙伴关系和强有力的执行力比冗长的白皮书和空洞的承诺更具吸引力。如今,这些项目已被列为评级最高的加密货币,投资者可以清晰看到其影响力。 随着2025年加密市场的持续演变,视觉呈现、战略联盟以及果断执行逐渐取代了厚重白皮书和模糊承诺的地位。目前,这些项目被归类为“顶级加密资产…

    2025年12月8日
    000
  • 咒语揭示了为其主动选择而选择的七个项目

    mantra宣布了其主动扶持计划中精选的七个关键项目,这些项目致力于推动现实世界资产的区块链化。在google cloud的支持下,该计划为入选项目提供必要的技术指导与资源支持。 Web3领域领军者Mantra近日公布了一项旨在助力现实世界资产代币化的重点项目计划。借助Google Cloud的技术…

    2025年12月8日
    000
  • Kaia是为高性能Kaia区块链提供动力的本地代币,是当今的最高收益者。

    kaia rallies两位数,交易量突破1亿美元 高性能KAIA区块链的原生代币成为今日最大赢家。过去24小时内,该山寨币在18天内上涨了12%。 这一急剧上涨趋势在两周内形成了最强劲的阳线,显示出强劲的动力。 KAIA价格飙升推动交易额超1亿美元 截至08:34 ET,KAIA价格达到0.119…

    2025年12月8日
    000
  • MEXC超过4000万用户,在2025年5月的新令牌清单上,交易量增长了46.7%

    mexc作为全球领先的加密货币交易平台,近日发布了其2025年5月的运营报告,再次展现出强劲的增长势头。 报告显示,MEXC在用户增长、交易量和业务发展等方面均取得显著成果。平台全球注册用户突破4000万大关,相比2024年底增长33%,仅用五个月时间便实现千万级用户增长。 新币上线与交易活跃度提升…

    2025年12月8日
    000
  • 未分类的序数NFT的售价为740万美元

    比特币网络上未分类的ordinal nft交易完成后 在今年的加密货币领域中,非同质化代币(NFT)无疑成为了焦点之一。虽然大部分关注集中在以太坊的NFT市场,但基于比特币的Ordinal NFT市场也在悄然崛起。 近日,这一市场迎来了重要进展:一枚未分类的Ordinal NFT以70.2 BTC的…

    2025年12月8日
    000
  • Binance有望分享有关超流动性(HYPE)的见解,表明其天然令牌可能列表

    binance再次分享了关于超流动性(hype)的动态,暗示其原生代币可能在交易所上市,引发市场关注。消息传出后,炒作代币价格上涨2%,交易量激增20%至1.5亿美元。 Binance似乎正在考虑在其美国平台上为Hyperliquid(HYPE)代币提供现货交易服务。 事件背景:Binance.us…

    2025年12月8日
    000
  • Opensea通过OS2升级再次证明了它的弹性

    opensea正借助备受期待的os2升级重新点燃社区活力,并吸引了新的关注。随着os2正式结束beta测试阶段,这也标志着平台进入了全新的发展阶段。 这家知名的NFT交易平台再次登上新闻头条,在经历了一段艰难时期后,带来了多项新功能与积极氛围。这一OS2升级终于上线,不仅开启了平台的新纪元,还引入了…

    2025年12月8日
    000
  • 随着美中贸易谈判的中心舞台,比特币(BTC)市场越来越高

    周一,更广泛的加密货币市场继续走高,但交易者仍在消化上周大幅抛售后的市场情绪,这种乐观情绪仍被视为暂时性的。 在伦敦举行的美中贸易谈判引起关注,美国财政部长斯科特·贝森特(Scott Bessent)预计将与中国副总理何立峰举行会谈。鉴于当前脆弱的外交休战状态以及市场对宏观经济信号的高度敏感,此次会…

    2025年12月8日
    000
  • IT Solutions提供商长方形计划通过私人股票销售计划筹集750万美元

    纳斯达克上市公司在声明发布后的24小时内,股价上涨了12%。 根据6月6日发布的公告,IT解决方案提供商长龙(Oblong)披露了其计划通过私募股票发售筹集750万美元,以支持其基于Bittensor的AI和数字资产财政部新项目。 在该公告发布后24小时内,这家纳斯达克上市公司的股价即上涨了12%。…

    2025年12月8日
    000
  • Qubic,分散的计算和AI第1层协议,通过有用的工作证明(Upow)实现了技术突破

    qubic作为去中心化计算与ai领域的第1层协议,成功验证了其“有用的工作证明”(upow)机制,标志着一项重大的技术突破。 qubic作为去中心化计算与ai领域的第1层协议,成功验证了其“有用的工作证明”(upow)机制,标志着一项重大的技术突破。 Qubic的挖矿业务最初通过Nanopool启动…

    2025年12月8日
    000
  • 尽管需求增加,但Binance Alpha点计划交易量仍在继续上升

    binance alpha point计划正在逐步重塑加密货币市场中的气流格局。然而,获取气动器的积分门槛却在持续上升。 Binance Alpha Point项目在加密圈内正经历着悄然演变。不过,获得空投资格的积分要求不断攀升。目前这一数字已突破200分大关,这让不少投资者感到难以企及。 值得注意…

    2025年12月8日
    000
  • Coinplex评论 – Coinplex是合法的还是骗局?最佳加密货币交易平台

    coinplex是一个加密货币交易平台,自引入以来,交易界就引起了人们的关注。 Coinplex是一个加密货币交易平台,自引入以来,交易界就引起了人们的关注。根据开发此交易平台的团队的说法,Coinplex可以通过自动化整个交易过程来帮助客户在加密货币交易市场中蓬勃发展。 Coinplex是一个加密…

    2025年12月8日
    000
  • Binance列表请参见主要上行空间,但波动率仍然存在

    on june 9, mirror tang, ceo of zerobase & salus, posted on x: “恭喜你研究出规律了,接下来规律就要变啦!” shortly after iosg ventures published an article discussing b…

    2025年12月8日
    000
  • 从模因到公用事业:Ozak AI在后海类市场中成为竞争者

    dogecoin(doge)最初只是一个玩笑,这款由网络迷因启发而来的加密货币以柴犬形象作为标志。 Dogecoin(Crypto:Doge)从一个迷因衍生的加密项目起步,其标志性形象是柴犬狗,迅速在网络社区中引发了广泛关注。在2021年牛市期间,该币种价格飙升,达到历史高点0.73美元。 尽管拥有…

    2025年12月8日
    000
  • 在垃圾邮件争议中,比特币核心捍卫继电器政策

    比特币核心阐述了其交易中继策略的初衷。它提到了优化费用预测、加快区块传播速度以及提高矿工对付费交易的可见性。 由社区推动的开源项目比特币核心(Bitcoin Core)近日发布了关于其交易中继策略的详细说明。尽管声明旨在围绕交易转发和垃圾邮件问题展开激烈讨论时捍卫其角色和愿景,但该文件却引发了比特币…

    2025年12月8日
    000
  • 随着市场再次转向看涨,投资者正在积极搜寻目前投资的最佳山寨币

    Mutuum Finance(MUTM)当前仅以0.03美元的价格交易,在2025年成为潜在的突破性竞争者。 市场再次转向看涨,投资者正积极寻找当下投资的最佳山寨币。在众多加密货币中,一个低价的DeFi代币表现突出,吸引了资深投资者的关注。 Mutuum Finance(MUTM)目前仅以0.03美…

    2025年12月8日
    000
  • 纳斯达克提议扩展加密ETF基准为包括XRP,SOL,ADA和XLM

    纳斯达克已向美国证券交易委员会(sec)提交了8-k表格,确认其计划扩大hashdex nasdaq crypto index us etf(nciq)所采用的基准资产范围,由原先的五种数字资产扩展至九种。 该交易所正寻求SEC批准对Hashdex Nasdaq Crypto Index US ET…

    2025年12月8日
    000
  • Berachain经历了巨大的转变,净流出超过11亿美元

    最近的链上分析让berachain再次成为加密圈关注的焦点,但这次并非因为积极进展。原本因其测试网阶段展现出的强大动能而备受赞誉, Berachain如今却经历了剧烈动荡,净资金流出超过11亿美元,总锁定价值(TVL)下滑逾70%,引发人们对该项目前景及用户信任度的严重担忧。 链上数据显示,Bera…

    2025年12月8日
    000
  • 比特币价格完成了艾略特波理论

    在过去几周里,比特币价格持续上涨,主要受到机构投资者的推动。这种上涨势头使比特币创下历史新高111,900美元,尽管市场情绪转为悲观,价格仍维持在100,000美元以上。 随着机构持续买入,比特币价格持续走高。BTC一度触及111,900美元的历史新高,即便市场情绪低迷,价格依旧站稳100,000美…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信