当前位置: 首页 > news >正文

promise和settimeout的区别,谈一谈eventloop

🌟 Promise 和 setTimeout 的区别

虽然 PromisesetTimeout 都用于处理异步操作,但它们在机制和执行顺序上有很大区别。要理解它们的区别,必须先了解 Event Loop


一、核心区别
特性PromisesetTimeout
异步队列微任务队列(Microtask Queue)宏任务队列(Macrotask Queue)
何时执行当前事件循环结束后立即执行下一轮事件循环时才执行
执行优先级
常见用途异步操作、异步链式调用定时任务、延时执行

🚀 二、Event Loop 详解

JavaScript 是单线程的,使用**事件循环(Event Loop)**来处理异步任务。任务分为两类:

  1. 宏任务(Macrotask)
    • 主代码块(script)
    • setTimeoutsetInterval
    • 事件回调(如点击、网络请求)
  2. 微任务(Microtask)
    • Promise 回调(then, catch, finally
    • MutationObserver
    • queueMicrotask

Event Loop 执行顺序:

  1. 执行同步任务(全局代码)。
  2. 执行所有微任务队列中的任务。
  3. 执行一个宏任务队列中的任务。
  4. 重复步骤 2 和 3,直到任务队列为空。

📝 三、代码示例:Promise 和 setTimeout 执行顺序

来看一个经典示例:

console.log("script start");

setTimeout(() => {
    console.log("setTimeout");
}, 0);

Promise.resolve().then(() => {
    console.log("promise1");
}).then(() => {
    console.log("promise2");
});

console.log("script end");

执行分析:

  1. 同步代码执行:

    script start
    script end
    

    同步任务先执行。

  2. 微任务执行:

    promise1
    promise2
    

    微任务比宏任务优先级高,Promise 回调属于微任务队列。

  3. 宏任务执行:

    setTimeout
    

    宏任务在所有微任务执行完成后才会执行。


输出顺序:

script start
script end
promise1
promise2
setTimeout

🪜 四、再来一个复杂点的示例

setTimeout(() => {
    console.log("timeout1");
}, 0);

Promise.resolve().then(() => {
    console.log("promise1");
    setTimeout(() => {
        console.log("timeout2");
    }, 0);
}).then(() => {
    console.log("promise2");
});

console.log("script end");

执行分析:

  1. 同步任务:

    script end
    

    直接打印。

  2. 微任务:

    promise1
    promise2
    

    两个 then 回调依次执行。

  3. 宏任务:

    timeout1
    timeout2
    

    两个 setTimeout 回调依次执行。


最终输出:

script end
promise1
promise2
timeout1
timeout2

🎯 五、真实场景应用:

1. 数据请求和处理

通常会使用 Promise 来进行数据请求和异步处理:

fetch("https://api.example.com/data")
    .then(response => response.json())
    .then(data => console.log("Data received:", data))
    .catch(error => console.error("Error:", error));

2. 轮询操作

在轮询操作中,可以结合 setTimeoutPromise

function pollData() {
    setTimeout(() => {
        fetch("https://api.example.com/status")
            .then(response => response.json())
            .then(data => {
                console.log("Status:", data);
                pollData();  // 继续轮询
            });
    }, 1000);
}

pollData();

🌐 六、总结

  1. 执行优先级:

    • Promise 属于微任务,优先级高。
    • setTimeout 属于宏任务,优先级低。
  2. 事件循环顺序:

    • 执行同步任务
    • 执行所有微任务
    • 执行下一个宏任务
  3. 编程应用:

    • 使用 Promise 实现异步链式调用
    • 使用 setTimeout 实现延迟执行

💡 面试要点:

  1. 为什么 PromisesetTimeout 先执行?

    • 因为 Promise 属于微任务,而 setTimeout 属于宏任务
  2. 如何控制异步任务顺序?

    • 利用 async/await 或将异步操作放在 Promise 中。
  3. 如何保证异步操作的顺序执行?

    • 通过链式调用then)、async/await、或将任务放入微任务队列中

希望这些讲解能帮助你彻底理解 PromisesetTimeout 的区别以及 Event Loop 的执行顺序!

相关文章:

  • 六、实战开发 uni-app x 项目(仿京东)- 分类页
  • 【二分算法】-- 寻找旋转排序数组中的最小值
  • 2025 香港 Web3 嘉年华:全球 Web3 生态的年度盛会
  • 如何进行前端项目的自动化部署?请简述主要流程和常用工具。
  • 电子电气架构 --- 智能座舱和车载基础软件简介
  • Qt 窗口以及菜单栏介绍
  • 谷歌搜索基本规则
  • 算法014——找到字符串中所有字母异位词
  • C++|构造函数和析构函数
  • 基于PHP的网店进销存管理系统(源码+lw+部署文档+讲解),源码可白嫖!
  • 练习-依依的询问最小值(前缀和差分)
  • C语言之链表
  • NocoBase 本周更新汇总:双因素身份认证(2FA)
  • HTML 字符集
  • Kubernetes的组成和架构
  • 一个简单的 **猜数字游戏** 的 C 语言例程
  • Java 用循环嵌套语句生成*三角形阵列
  • Vue3组件+leaflet,实现重叠marker的Popup切换显示
  • 51单片机的工作过程
  • Vue-Router:构建单页面应用的路由管理利器
  • 复旦兼职教授高纪凡首秀,勉励学子“看三十年才能看见使命”
  • 三人在共享单车上印小广告被拘,北京警方专项打击非法小广告
  • 国家统计局:1-4月份,全国固定资产投资同比增长4.0%
  • 从良渚到三星堆:一江水串起了5000年的文明对话
  • “80后”萍乡市安源区区长邱伟,拟任县(区)委书记
  • 世界数字教育大会发布“数字教育研究全球十大热点”