JavaScript Promise异步调用阻塞:为什么await会卡住程序?

javascript promise异步调用阻塞:为什么await会卡住程序?

js promise同步调用的阻塞问题

在javascript中,对于一段异步操作,可以将其包装成一个promise,以便可以使用 await 关键字来同步调用。但当promise没有被显式地通过 resolve 或 reject 来解决时,会引发阻塞问题。

node.js 环境

在node.js中,如果一个promise处于挂起状态,并且没有其他待处理的异步操作,那么node.js将认为程序已经完成并退出。因此,yyy 函数将运行到 await xxx(),但不会继续执行后面的代码,因为 xxx 函数返回的promise一直处于挂起状态。

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

浏览器环境

在浏览器中,await 会等待promise解决。如果promise没有被解决,浏览器将不会继续执行后面的代码,但用户仍可以与页面交互。因此,yyy 函数将阻塞在 await xxx(),直到 xxx 函数返回的promise被解决或页面关闭。

示例代码

以下代码演示了在浏览器环境下,yyy 函数被阻塞的情况:

async function yyy() {    console.log('yyy调用xxx开始');    let res = await xxx();    console.log('yyy调用xxx结束', res);}async function xxx() {    return new Promise(function(resolve, reject) {        let time = new Date().getTime();        while(1) {            let current = new Date().getTime();;            if(current - time > 1000){                console.log('xxx running ...');                time = new Date().getTime();            }        }    });}yyy();

执行此代码,你会看到 yyy 函数持续阻塞,而 xxx 函数在后台运行。

以上就是JavaScript Promise异步调用阻塞:为什么await会卡住程序?的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 20:45:08
下一篇 2025年12月19日 20:45:16

相关推荐

  • 测试数据管理:综合指南

    为什么测试数据管理对于现代开发至关重要 在当今快节奏的软件开发环境中,测试数据管理 (TDM) 在确保测试过程的质量、速度和效率方面发挥着关键作用。随着企业努力追求更快的发布和更好的软件质量,有效管理测试数据变得比以往任何时候都更加重要。 什么是测试数据管理? 测试数据管理是指创建、管理和维护用于测…

    2025年12月19日
    000
  • 正则表达式/[1-9]\d*$/为什么匹配-1?

    正则表达式 /[1-9]d*$/ 与意外的 -1 正则表达式 /[1-9]d*$/旨在匹配一个正整数,即不含小数点或负号的整数。然而,我们发现当传入 “-1” 时,该正则表达式却返回了 true,这与我们的预期不符。 原因在于,该正则表达式只检查了字符串末尾的数字,而没有考虑…

    2025年12月19日
    000
  • JavaScript状态锁失效:为什么快速点击会引起函数重复执行?

    状态锁失效的原因 在提供的代码中,状态锁 is_runing 似乎失效,导致快速连续点击复选框时 run_task 函数执行了两次。 这是由于 javascript 的事件循环机制。当点击复选框时,onchange 事件被添加到任务队列中。此时,is_runing 已被标记为 true,但 run_…

    2025年12月19日
    000
  • 创建 CLI 来搭建扩展

    在之前的练习中,我们使用 typescript 构建了一个浏览器扩展。这涉及一系列步骤,包括创建 vite 项目并对其进行定制以满足浏览器扩展的特定要求。虽然该过程并不是特别漫长或复杂,但我们可以通过使用 node cli(命令行界面)实现自动化来进一步简化它。如果您是 cli 新手,请让我引导您完…

    2025年12月19日
    000
  • 未定义与未定义

    首先,我们需要了解 javascript 代码执行过程,它由两个阶段组成:内存创建阶段和代码执行阶段。 “未定义”和“未定义”都与内存空间有关。 未定义 在内存创建阶段,变量和函数被存储为键值对。 javascript 将 undefined 分配给每个变量作为占位符。这个临时值会一直保留,直到 j…

    2025年12月19日
    000
  • 每个开发人员都应该掌握提高生产力和发展的基本工具

    在快速发展的软件开发世界中,生产力和持续增长至关重要。开发人员选择的工具可以显着影响他们的效率、创造力和职业发展。每个开发人员都应该掌握以下五个基本工具,以在他们的技术中脱颖而出: 版本控制系统(例如 Git)版本控制系统是现代开发工作流程的支柱。 Git 是最受欢迎的选择,它允许开发人员跟踪更改、…

    2025年12月19日
    000
  • RxJS流操作:为什么筛选偶数并乘以2无效?

    在使用 rxjs 操作流元素时遇到的困惑 对于如何使用 rxjs 强大的运算符对流元素进行操作,许多开发者都会遇到疑问。本文将解决这样的一个问题:当尝试找出流中的偶数并乘以 2 时,代码却不生效。 原始代码如下: import { of } from ‘rxjs’;import { filter, …

    2025年12月19日
    000
  • 掌握异步 JavaScript:回调、Promise 和简化的 Async/Await

    异步 javascript:从回调到 promise 和 async/await 介绍 javascript 是一种强大的单线程编程语言,广泛用于 web 开发。 javascript 中的一个常见挑战是处理异步任务,例如从 api 获取数据或执行时间敏感的操作,而不阻塞主线程。随着时间的推移,开发…

    2025年12月19日
    000
  • 掌握 TypeScript 模板文字类型:提高代码安全性和表现力

    好吧,让我们进入使用模板文字类型在 typescript 中进行编译时元编程的迷人世界。这个强大的功能使我们能够创建一些非常酷的类型级魔法,使我们的代码更安全、更具表现力。 首先,模板文字类型到底是什么?它们是一种基于字符串文字操作和创建新类型的方法。这就像拥有一种适合您类型的迷你编程语言。很整洁,…

    2025年12月19日
    000
  • 了解 Playwright:自动化 Web 测试的未来

    剧作家的定义 Playwright 是一个现代的开源测试框架,使开发人员能够以速度、可靠性和跨浏览器支持自动执行 Web 应用程序的端到端测试。它由 Microsoft 构建,解决了传统测试工具面临的许多挑战,为现代 Web 应用程序提供无缝自动化。 什么是剧作家? Playwright 是一个 N…

    2025年12月19日
    000
  • JS 中的三元运算符:您需要了解的一切

    什么是三元? 三元运算符是一个 javascript 运算符,自 2015 年 7 月起可跨浏览器使用。它是 if/else 语句的简写替代方案。该运算符广泛应用于 java、c、python 等不同的编程语言中,但本文的重点将放在 javascript 上。 让我们看看三元运算符的一般语法。 co…

    2025年12月19日
    000
  • JavaScript井号函数名:为什么我的WebView报错而Chrome正常?

    JavaScript井号(#)命名浏览器兼容性问题 在使用npm的pdf-dist包时,遇到浏览器兼容性问题。在WebView中,以井号(#)开头的函数名会出现”Unexpected token”的语法错误,而Chrome浏览器中没有问题。 解决方法: Android Web…

    2025年12月19日
    000
  • 使人才与业务目标保持一致:数据驱动的方法

    介绍 在快速发展的技术环境中,企业必须聘用不仅满足最低可行要求(MVR)而且还能通过机会领域为未来增长做出贡献的人才。在 TeamStation AI,我们采用数据驱动的方法来进行人才调整。本文探讨了我们如何使用数学模型使人才与业务目标保持一致,重点关注投资回报率和长期战略成功。 了解人才调整 最低…

    2025年12月19日
    000
  • 使用 Cloudflare Workers 实施 Gmail 发送 – 开发指南

    这是使用 cloudflare workers 实施 gmail 发送系列的第 2 部分: 第 1 部分:设置 ✅第 2 部分:开发环境(当前)第 3 部分:实施(即将推出) 介绍 在第 1 部分中设置 gmail api 访问权限后,我们现在将为 cloudflare workers 配置开发环境…

    2025年12月19日
    000
  • Android WebView中井号开头函数名导致语法错误该如何解决?

    webview中命名规范与井号函数名处理 在使用javascript中,建议采用字母、数字、下划线和$组合的命名规范,且首字符不能为数字。然而,在引入pdf-dist (2.14)后,用户在android webview中遇到语法错误,提示井号开头的函数名语法错误。 经过验证,ai的回答不正确,私有…

    2025年12月19日
    000
  • 为什么document.write无法重载defer脚本?

    为什么使用 document.write 无法重载 defer 脚本 在给定的代码段中,在页面加载后,document.write 无法重载 defer 脚本 2.js 和 3.js。 根源在于异步加载的 defer 脚本和 document.write 之间的交互。defer 脚本会在文档的 re…

    2025年12月19日
    000
  • 如何提前通知Quartz定时任务的执行?

    quartz 任务调度中的提前通知设置 在任务调度中,您需要在特定任务开始前一定时间发送通知。为了实现这一目标,有几种方法可以在不修改前端代码的情况下实现。 创建附加 quartz 定时任务 您可以创建另一个 quartz 定时任务,其表达式配置为在原任务执行前执行。例如,如果原任务使用每天 10:…

    好文分享 2025年12月19日
    000
  • Quartz任务如何提前预知并通知即将执行的Cron任务?

    quartz如何预先通知即将到来的cron任务? 您正在使用quartz调度程序来根据cron表达式安排任务。现在,您希望在每次任务开始前一段时间(例如 1 天、一周或 15 分钟)发送通知。 当您不希望更改前端时,实现这一目标的好方法是: 创建第二个quartz定时任务:将第二个quartz定时任…

    2025年12月19日
    000
  • Angular’s Biggest Misconception: “It’s Not Worth Learning Due to Fewer Jobs”

    在选择前端框架时,对 Angular 的一个常见误解是学习它不值得,因为“没有足够的工作机会”。让我们揭穿这个神话并探索 Angular 在就业市场中的现实地位。 为什么会存在这种误解? 这种信念源于将 Angular 职位发布数量与 React 进行比较。在许多地区,React 职位的数量通常超过…

    2025年12月19日
    000
  • 使用 populateDropdown 简化您的下拉菜单管理

    让我们开始吧!假设您正在构建一个动态 web 应用程序,常见任务之一是根据各种数据源填充下拉菜单。如果没有简化的方法,您会发现自己编写重复且容易出错的代码,这对于维护来说可能是一场噩梦。这时,一个简单而强大的函数(如 populatedropdown)可以发挥作用。它消除了麻烦,让您的生活变得更加轻…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信