软件教程 2025年08月6日
0 收藏 0 点赞 181 浏览 1377 个字
摘要 :

文章目录 Promise 的基本概念 示例代码分析 执行行为分析 结论 本文探讨了 JavaScript 中 Promise 的使用是否会将同步代码变为异步代码。通过分析 Promise 的基本概念……




  • Promise 的基本概念
  • 示例代码分析
  • 执行行为分析
  • 结论

本文探讨了 JavaScript 中 Promise 的使用是否会将同步代码变为异步代码。通过分析 Promise 的基本概念以及两个示例函数(一个使用 setTimeout 模拟异步操作,另一个使用 while 循环模拟同步阻塞),文章指出 Promise 本身并不改变代码的同步或异步性质。即使代码被封装在 Promise 中,同步操作仍然会阻塞主线程,而异步操作则不会。

在 JavaScript 开发中,Promise 是一个强大的工具,用于处理异步操作。但很多人会误以为,将代码封装到 Promise 中,原本的同步代码就会变成异步代码。本文将通过具体示例来探讨这一问题。

Promise 的基本概念

Promise 是一个表示异步操作最终完成或失败的对象,它有三种状态:pending(进行中)、fulfilled(已完成)和 rejected(已失败)。它提供了处理成功或失败结果的方法。

示例代码分析

以下是两个函数示例:

const a = arg => {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log(arg)
      resolve(arg)
    }, 1000)
  })
}

const b = arg => {
  return new Promise(resolve => {
    let now = Date.now()
    while (Date.now() - now < 1000) {
      // do nothing
    }
    console.log(arg)
    resolve(arg)
  })
}

 

  • 函数 a 使用 setTimeout 模拟异步操作,延迟 1000 毫秒后执行。
  • 函数 b 使用 while 循环阻塞主线程约 1000 毫秒。

接下来,我们在一个异步自执行函数中调用这些函数:

;(async () => {
  // a 执行
  console.time(\'time a\')
  await Promise.all([a(1), a(2)])
  console.timeEnd(\'time a\') // 预期输出: time a: 接近 1000ms

  // b 执行
  console.time(\'time b\')
  await Promise.all([b(1), b(2)])
  console.timeEnd(\'time b\') // 预期输出: time b: 接近 2000ms
})()

执行行为分析

函数 a 的执行

  • a(1) 和 a(2) 立即返回 Promise,并在 1000 毫秒后完成。
  • Promise.all 等待所有 Promise 完成,总时间接近 1000 毫秒。
  • setTimeout 是非阻塞的,不会阻塞主线程。

函数 b 的执行

  • b(1) 和 b(2) 立即返回 Promise,但内部的 while 循环阻塞主线程约 1000 毫秒。
  • Promise.all 依次执行 b(1) 和 b(2),总时间约为两个阻塞时间的总和,即 2000 毫秒。

结论

  • Promise 本身不会改变代码的同步或异步性质。
  • 函数 a 中的异步操作不会阻塞主线程。
  • 函数 b 中的同步操作仍然会阻塞主线程。

Promise 是一个强大的工具,用于处理异步操作的结果,但它本身并不改变代码的同步或异步性质。理解这一点对于编写高效且响应迅速的 JavaScript 应用至关重要。希望本文能帮助你更好地理解 Promise 和同步/异步代码之间的关系。

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/6759.html

管理员

相关推荐
2025-08-06

文章目录 一、Promise基础回顾 二、Promise 与 axios 结合使用场景及方法 (一)直接返回 axios …

269
2025-08-06

文章目录 一、模块初始化时的内部机制 二、常见导出写法的差异分析 (一)写法一:module.exports…

107
2025-08-06

文章目录 一、ResizeObserver详解 (一)ResizeObserver是什么 (二)ResizeObserver的基本用法 …

683
2025-08-06

文章目录 一、前期准备工作 (一)下载相关文件 (二)安装必要工具 二、处理扣子空间生成的文件…

338
2025-08-06

文章目录 一、官方文档 二、自动解包的数据类型 ref对象:无需.value即可访问 reactive对象:保持…

371
2025-08-06

文章目录 一、Hooks的工作原理 二、在if语句中使用Hook会出什么岔子? 三、React官方的Hook使用规…

843
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号