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

yizhihongxing

当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分层架构低代码跨iframe拖拽示例详解

    本文主要介绍了一种基于JavaScript分层架构,低代码实现跨iframe拖拽(drag and drop)的示例。以下是完整攻略: 概述 JS分层架构是一种标准化组织JavaScript代码的方式,将代码按照功能分为不同的层,如数据层、业务逻辑层和UI层。采用此方式可以提高代码的可维护性和可扩展性。 低代码是一种可以供非专业人员使用的开发方式,它减少了编…

    JavaScript 2023年6月11日
    00
  • jQuery中DOM节点的删除方法总结(超全面)

    jQuery中DOM节点的删除方法总结(超全面) 1. jQuery 中的节点删除方法 在前端开发中,我们经常需要对DOM元素进行操作。当不需要某一个DOM节点时,我们需要将其从页面中移除。在jQuery中,有多种方式可以删除DOM节点。下面我们一一介绍这些方法。 1.1 remove()方法 remove()方法可以删除选定的元素,包括其子元素。它用于彻底…

    JavaScript 2023年6月10日
    00
  • JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍

    JavaScript 中定义函数有两种常用的方式:使用函数表达式(function expression)和函数声明(function declaration)。在使用函数表达式时,可以使用 var 声明一个变量并赋值为函数,也可以使用 function 关键字直接定义函数。那么 var foo = function () {} 和 function foo…

    JavaScript 2023年5月27日
    00
  • 微信小程序倒计时功能实现代码

    下面是讲解“微信小程序倒计时功能实现代码”的完整攻略。主要分为以下几个步骤: 步骤一:编写倒计时函数 倒计时的实现需要从当前时间开始计算,计算出设定的截止时间,然后不断刷新倒计时的显示,直到倒计时结束。下面是一个简单的倒计时函数实现示例: function countdown(endTime) { var now = +new Date(); // 计算剩余…

    JavaScript 2023年6月11日
    00
  • setinterval()与clearInterval()JS函数的调用方法

    下面是关于setInterval()和clearInterval()函数的完整攻略。 setInterval()函数 setInterval()是一个用来循环执行代码的JavaScript函数。我们可以使用它执行一些周期性任务,例如更新UI,展示动画等。 它的语法如下: var intervalID = setInterval(callback, delay…

    JavaScript 2023年6月11日
    00
  • jquery中validate与form插件提交的方式小结

    来详细讲解一下“jquery中validate与form插件提交的方式小结”的完整攻略。 一、什么是jQuery Validation? jQuery Validation 是一个非常流行的 jQuery 表单验证插件,它可以帮助我们验证用户输入的数据是否合法。使用jQuery Validation可以方便地进行表单验证,使用方式简单易懂,可以兼容不同浏览器…

    JavaScript 2023年6月10日
    00
  • JavaScript Event学习第七章 事件属性

    下面给你详细讲解 JavaScript Event 学习第七章 事件属性的完整攻略。 事件属性 事件属性是针对事件对象提供的属性,通过这些属性可以获取事件的各种信息。下面是常见的事件属性: 1. type type属性用于返回事件类型,是必需的。例如: element.addEventListener(‘click’, function(event) { c…

    JavaScript 2023年6月11日
    00
  • 分享ES6 20个经常使用技巧

    分享ES6 20个经常使用技巧 本篇文章将分享ES6中经常使用的20个技巧。这些技巧可以让你更加方便地编写JavaScript代码。本文将以示例的形式演示这些技巧。 技巧1:使用箭头函数 ES6中引入了箭头函数,可以让函数表达式更加简单,主要特点有以下几点: 使用“=>”符号来代替“function”关键字 如果函数只有一行代码,可以省略“{}”大括号…

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