首页 > 其他分享 >Promise和setTimeout执行先后有什么区别?

Promise和setTimeout执行先后有什么区别?

时间:2024-12-16 09:20:36浏览次数:9  
标签:异步 setTimeout 区别 队列 任务 Promise 执行

在前端开发中,PromisesetTimeout 都是处理异步操作的重要工具,但它们之间有一些关键的区别,这些区别会影响它们的执行顺序和如何处理异步逻辑。

  1. 事件循环与任务队列

    • JavaScript 运行在单线程环境中,通过事件循环(Event Loop)来处理同步和异步任务。
    • 同步任务直接执行,而异步任务会被放入任务队列(Task Queue)中等待执行。
    • PromisesetTimeout 都会产生异步任务,但它们被放入队列的方式和时间点有所不同。
  2. Promise 的执行

    • Promise 是立即执行的,它的构造函数中的代码会同步执行。
    • Promisethencatch 方法注册的回调函数是异步的,它们会在当前同步代码执行完毕后,且 Promise 状态改变时(从 pending 变为 resolved 或 rejected)被放入微任务队列(Microtask Queue)中。
    • 微任务队列中的任务会在事件循环的当前迭代结束时立即执行,优先于宏任务队列(Macrotask Queue)中的任务。
  3. setTimeout 的执行

    • setTimeout 用于在指定的延迟时间后将一个函数放入宏任务队列中。
    • 宏任务队列中的任务会在事件循环的下一个迭代开始时执行。
    • 这意味着,即使 setTimeout 的延迟时间设置为 0,它的回调函数也会在当前同步代码和所有微任务执行完毕后才会执行。
  4. 执行顺序示例

以下是一个简单的示例,展示了 PromisesetTimeout 的执行顺序:

console.log('Start'); // 同步代码,立即执行

const promise = new Promise((resolve) => {
    console.log('Promise Constructor'); // Promise 构造函数中的代码同步执行
    resolve();
});

promise.then(() => {
    console.log('Promise Resolved'); // Promise 状态改变后,回调函数被放入微任务队列中
});

setTimeout(() => {
    console.log('SetTimeout Executed'); // setTimeout 回调函数被放入宏任务队列中,稍后执行
}, 0);

console.log('End'); // 同步代码,立即执行

输出顺序可能是:

Start
Promise Constructor
End
Promise Resolved // 微任务队列中的任务在当前迭代结束时执行
SetTimeout Executed // 宏任务队列中的任务在下一个迭代开始时执行

这个示例展示了 PromisesetTimeout 在事件循环中的不同处理方式,以及它们如何影响异步代码的执行顺序。

标签:异步,setTimeout,区别,队列,任务,Promise,执行
From: https://www.cnblogs.com/ai888/p/18609203

相关文章

  • 什么是数据库的逻辑删除?数据库的物理删除和逻辑删除有什么区别?
    数据库的逻辑删除逻辑删除是指通过标记的方式将数据标记为删除状态,而不直接从数据库中删除该数据。这通常通过在表中增加一个“删除标志”字段(例如is_deleted或status)来实现。逻辑删除的数据通常在业务逻辑中被忽略,但在数据库中仍然存在。逻辑删除的特点保留数据:数据并未被......
  • 参数占位符 #{xx} 和 ${xx} 的区别
    #{xx}:带有#{}的SQL会采用SQL预编译技术,预编译后的SQL中#{}被替换为“?”,这里的“?”叫变量占位符,在实际执行SQL时会用“xx”的实际值替换变量占位符,效率更高,可以防止SQL注入SQL预编译:MySQL执行SQL有几个步骤,“查缓存->[语法分析->优化->编译->]执行”,如果缓存中存在该SQL则......
  • HarmonyOS Next 中的 HAP、HAR、HSP 区别
    HarmonyOSNext中的HAP、HAR、HSP区别想要更加合理的开发一个企业级别的Harmony应用,那么就不得不提其中的HAP、HAR、HSP了。前言对于普通的用户来说,可能一个普通的应用就等于一个安装文件如安卓下的APK。但是对于Harmony应用开发工程师来讲,一个应用包含的内容仅仅不止......
  • MySQL 中 EXISTS 和 IN 的区别是什么?
    在MySQL中,EXISTS和IN都用于在子查询中进行条件判断,但它们的使用场景和性能有一定区别。以下是EXISTS和IN的主要区别:1.功能和用法EXISTS:EXISTS用于检查子查询是否返回至少一行数据。如果子查询返回至少一行数据,EXISTS的条件为真,否则为假。EXISTS通常与SELE......
  • MySQL 中 InnoDB 存储引擎与 MyISAM 存储引擎的区别是什么?
    MySQL中InnoDB存储引擎与MyISAM存储引擎是两种常见的存储引擎,它们在性能、事务支持、锁机制、数据完整性等方面存在一些显著的区别。以下是它们的主要区别:1.事务支持InnoDB:支持事务,符合ACID(原子性、一致性、隔离性、持久性)特性。事务管理通过COMMIT、ROLLBACK和SAVEP......
  • MySQL 中 VARCHAR(100) 和 VARCHAR(10) 的区别是什么?
    在MySQL中,VARCHAR(100)和VARCHAR(10)都是变长字符串类型,但它们的主要区别在于能够存储的最大字符长度不同:1.存储长度VARCHAR(100):表示该字段可以存储最多100个字符(根据字符集的不同,一个字符可能占用1到多个字节)。如果存储的数据长度小于100个字符,MySQL只会占用实际......
  • MySQL 中 DATETIME 和 TIMESTAMP 类型的区别是什么?
    在MySQL中,DATETIME和TIMESTAMP都是用于存储日期和时间的类型,但它们有一些关键的区别:1.存储方式和范围DATETIME:存储的日期和时间值是以“年-月-日时:分:秒”的格式表示。存储格式:DATETIME存储的是固定的日期和时间信息,不受时区的影响。范围:DATETIME的值范围为'1000-01-0......
  • MySQL 中 INNER JOIN、LEFT JOIN 和 RIGHT JOIN 的区别是什么?
    在MySQL中,INNERJOIN、LEFTJOIN和RIGHTJOIN是用于连接两个或多个表的操作符,它们的主要区别在于如何处理匹配的记录和不匹配的记录。INNERJOIN:只返回两个表中匹配的记录。如果在左表和右表中找不到匹配的行,那么这些行将不会出现在结果集中。语法:SELECTcolumnsFRO......
  • 如何实现接口继承与实现继承的区别?如何处理多态性与性能的平衡?
    接口继承与实现继承的区别及实现方式接口继承(纯虚函数)在C++中,接口继承主要通过纯虚函数来实现。纯虚函数是在基类中声明的虚函数,它在基类中没有定义,只提供了函数签名,其形式为virtual返回类型函数名(参数列表)=0;。例如:classShape{public:virtualdoublearea......
  • MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?
    MySQL中count(*)、count(1)和count(字段名)的区别在MySQL中,COUNT()函数用于统计记录数。虽然COUNT(*)、COUNT(1)和COUNT(字段名)的功能类似,但它们在执行逻辑和结果上有所不同。1.count(*)特点统计表中所有行的数量,包括NULL值。执行时不会忽略任何行。通常......