JS promise 的回调和 setTimeout 的回调到底谁先执行

当JS中存在多个回调函数时,它们的执行顺序由它们注册的顺序决定。考虑以下例子:

setTimeout(() => {
  console.log('Timeout callback');
}, 0);

Promise.resolve().then(() => {
  console.log('Promise callback');
});

这里我们有一个setTimeout回调和一个promise回调。许多人会认为,setTimeout的回调先于Promise回调执行,因为setTimeout的时间间隔为0,无论如何都会先执行。然而,实际执行结果是Promise回调先执行,因为Promise回调是由微任务处理的,而setTimeout回调是由宏任务处理的。

具体来说,当推入promise回调函数时,它会被添加到当前执行线程的微任务队列中,并在当前宏任务结束之前执行。此时setTimeout回调被添加到了属于下一批宏任务的任务队列中,因此当宏任务结束并开始另一个任务时,setTimeout回调会在Promise回调之后执行。

另一个例子:

setTimeout(() => {
  console.log('Timeout callback');
  Promise.resolve().then(() => {
    console.log('Promise callback');
  });
}, 0);

在这种情况下,setTimeout回调函数先执行,但是由于promise回调函数是由setTimeout回调函数内的微任务队列处理的,因此Promise回调函数在setTimeout回调函数执行结束后立即执行。

总之,当存在多个回调函数时,我们必须要考虑它们注册的顺序和它们所属的队列类型,以确定它们的执行顺序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS promise 的回调和 setTimeout 的回调到底谁先执行 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 深入理解在JS中通过四种设置事件处理程序的方法

    请听我详细讲解“深入理解在JS中通过四种设置事件处理程序的方法”的完整攻略。 一、背景介绍 在JavaScript编程中,经常需要响应用户的事件行为,例如:点击、按下键盘以及提交表单等。在Web开发中,为了响应这些事件,我们需要给页面中的某个元素添加一个事件处理程序。JavaScript中有多种方式来添加事件处理程序,本篇攻略将为大家详细讲解这四种方法。 二…

    JavaScript 2023年5月28日
    00
  • JS简单测试循环运行时间的方法

    下面是关于JS简单测试循环运行时间的方法的攻略。 1. 背景 在编写JavaScript程序的过程中,有可能需要对程序进行性能测试,以确定代码的运行时间。本文将介绍如何使用JavaScript来测试循环运行时间的方法。 2. 代码示例 示例 1: 下面就是一个通过比较时间差来测试循环执行时间的示例代码: // 定义一个需要测试运行时间的函数 function…

    JavaScript 2023年5月27日
    00
  • 原生javascript模仿win8等待提示圆圈进度条

    让我来详细讲解一下“原生javascript模仿win8等待提示圆圈进度条”的完整攻略。 1. 初始HTML结构 首先,在HTML中定义一个div容器作为等待提示圆圈进度条的载体,如下所示: <div id="spinner"></div> 2. CSS样式 接着,我们需要定义CSS样式来实现圆形线条的旋转动画效果…

    JavaScript 2023年6月11日
    00
  • 原生Javascript封装的一个AJAX函数分享

    下面我来详细讲解 “原生Javascript封装的一个AJAX函数分享”的完整攻略。 1. 什么是 AJAX AJAX(Asynchronous JavaScript and XML)是一种用于创建快速动态网页的技术。AJAX 不是一种新的编程语言,而是一种将现有的标准组合在一起使用的技术。它利用了 JavaScript 和 XML 的优点,在页面不需要重新…

    JavaScript 2023年6月11日
    00
  • 详解小程序退出页面时清除定时器

    下面是详解小程序退出页面时清除定时器的完整攻略。 一、背景 在小程序中,定时器往往是我们经常使用的一种技术手段。但在某些情况下,小程序退出页面时可能会出现未被清除的定时器问题,这会导致页面卡顿、资源浪费等问题。 所以,在小程序中使用定时器时,一定要注意在页面退出时清除定时器。 二、如何清除定时器 下面我们介绍两种清除定时器的方法: 1. 通过 clearIn…

    JavaScript 2023年6月11日
    00
  • 浅谈JavaScript的push(),pop(),concat()方法

    浅谈JavaScript的push(),pop(),concat()方法 JavaScript作为一种脚本语言,其内建函数在数组和字符串方面功能十分强大。其中,push(),pop()和concat()方法在数组操作中非常重要。 push()方法 push()方法用于向数组的末尾添加一个或多个元素,并返回更新后的数组长度。 语法: array.push(el…

    JavaScript 2023年5月27日
    00
  • 使用JSLint提高JS代码质量方法分享

    下面我将为你讲解如何使用JSLint来提高JS代码质量的完整攻略。 什么是 JSLint? JSLint 是一个自动检测 JavaScript 代码风格和错误的工具,它可以帮助您编写更加规范和健壮的 JavaScript 代码。 如何使用 JSLint 检测 JavaScript 代码? 你可以使用以下两种方法使用 JSLint 检测 JavaScript …

    JavaScript 2023年5月19日
    00
  • 用js来生成随机彩票号码清单

    生成随机彩票号码清单是在web开发中常遇到的问题,下面按照以下步骤来演示生成彩票号码的完整攻略: 第一步:创建HTML骨架 首先需要在HTML页面中创建一个合适的骨架。可以考虑使用以下HTML代码: <!DOCTYPE html> <html lang="en"> <head> <meta cha…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部