JavaScript Promise同步调用:await一个未resolve/reject的Promise会发生什么?

javascript promise同步调用:await一个未resolve/reject的promise会发生什么?

javascript promise 同步调用中的困惑

在 javascript 中使用 promise 时,有时候会出现看似同步调用的情况,导致令人困惑的结果。

在下列代码中:

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) {});}

问题:

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

函数 xxx 中没有调用 resolve 或 reject,那么函数 yyy 在运行到 await xxx() 时会结束运行还是一直阻塞?没有执行 console.log(‘yyy调用xxx结束’, res),程序是自动结束了还是阻塞中?

回答:

答案因运行环境而异:

node.js

在 node.js 中,返回的 promise 永远处于挂起状态,因为没有被 resolved 或 rejected。但是,由于没有其他活跃的异步操作,node.js 的事件循环会认为程序已完成,导致进程退出。

浏览器

在浏览器中,await 会一直等待 promise 完成。如果没有其他异步操作,浏览器可能会认为脚本已执行完毕,但你的脚本的剩余部分将不会执行。用户仍然可以与页面交互,但你的脚本不会继续运行。

为了避免这种情况,可以将 xxx 函数修改为一个始终返回 resolved promise 的函数,例如:

async function xxx() {  return new Promise((resolve, reject) => {    resolve('已完成');  });}

这样,yyy 函数将始终执行 console.log(‘yyy调用xxx结束’, res),并且不会阻塞脚本执行。

以上就是JavaScript Promise同步调用:await一个未resolve/reject的Promise会发生什么?的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 20:47:09
下一篇 2025年12月19日 20:47:22

相关推荐

  • JS Promise异步调用为何会阻塞主线程?

    js promise 同步调用为何阻塞? 对于问题中呈现的代码: async function yyy() { console.log(‘yyy调用xxx开始’) let res = await xxx() console.log(‘yyy调用xxx结束’, res)} async function…

    2025年12月19日
    000
  • Vue中如何实现滚动到顶部加载更多数据且保持滚动位置不变?

    vue 滚动到顶部时加载更多数据,但保持滚动位置不变 在某些场景中,我们需要类似微信聊天记录那样,当用户向上滚动到顶部时加载更多历史记录,但滚动条位置依然保持在当前位置。 下面提供一种解决方法: {{ item }} import { createApp, ref, nextTick } from …

    2025年12月19日
    000
  • 如何在本机反应中按下“下一个”键盘按钮后选择下一个 TextInput?

    步骤: 使用 ref 控制焦点 为每个 textinput 分配一个引用,以编程方式控制焦点。 处理提交编辑 使用 onsubmitediting 事件来聚焦下一个输入。 设置 returnkeytype 将中间字段的 returnkeytype 设置为“next”,将最后一个字段设置为“done”…

    2025年12月19日
    000
  • 即时设计如何实现复制透明PNG图片并保留透明效果?

    如何实现即时设计中复制透明png图片 即时设计是一款在线设计工具,允许用户复制带有透明背景的PNG图片。与传统的Clipboard API复制相比,即时设计中的复制方法特别之处在于保留了图片的透明效果。 即时设计复制过程 当用户选择复制一个带有透明背景的元素时,即时设计会在后台执行以下步骤: 将元素…

    2025年12月19日
    000
  • JavaScript中如何异步中断for循环的执行?

    如何在javascript中从外部中断for循环的执行? 在javascript单线程的环境中,同步for循环一旦开始执行,就无法通过内部变量从外部中断。不过,我们可以通过异步的方式来实现从外部中断for循环。 解决方案:异步for循环 使用promise和async/await语法,我们可以创建异…

    2025年12月19日
    000
  • 如何通过异步编程中断JavaScript中的for循环?

    如何从外部中断 javascript 中的 for 循环执行? 在 javascript 中,当需要从外部中断 for 循环的执行时,可以使用异步编程的方法。这是因为 javascript 是一种单线程执行环境,这意味着同步 for 循环无法在执行过程中中断。 解决方案: 要在外部中断 for 循环…

    2025年12月19日
    000
  • JavaScript Promise异步调用阻塞:为什么await会卡住程序?

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

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

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

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

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

    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
  • 使人才与业务目标保持一致:数据驱动的方法

    介绍 在快速发展的技术环境中,企业必须聘用不仅满足最低可行要求(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
  • 如何提前通知Quartz定时任务的执行?

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

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

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

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

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

    2025年12月19日
    000
  • Vue 3中如何绕过createApp单次调用限制?

    如何在 vue 3 中多次调用 createapp? vue 3 中,createapp 只可调用一次。然而,在某些情况下,我们需要手动挂载组件。以下介绍两种解决此问题的方案: 场景一:手动挂载弹窗 // 使用 createapp 创建一个局部应用const localapp = createapp…

    2025年12月19日
    000
  • Vue3中createApp多次调用:如何解决单例模式下的多实例化难题?

    单例与多实例化之间的难题:vue3 的 createapp 多次调用 在 vue3 中,createapp 的官方文档明确阐明其“单例”性质,即应用程序中只能调用一次。然而,在某些场景下,开发人员可能会面临需要多次调用 createapp 的情况,这引发了技术上的难题。本文将探究如何解决这一难题。 …

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信