首页 > 其他分享 >事件循环训练题

事件循环训练题

时间:2024-05-29 15:59:48浏览次数:9  
标签:console log 训练 script 任务 循环 事件 setTimeout asyncFunc

题目

console.log("script start"); // 宏任务

async function asyncFunc() {
  console.log("asyncFunc start");
  await Promise.resolve(); // 等待Promise解决
  console.log("asyncFunc promise resolved");
}

asyncFunc(); // 调用async函数

setTimeout(function () {
  console.log("setTimeout"); // 宏任务
}, 0);

Promise.resolve()
  .then(function () {
    console.log("promise1"); // 微任务
    return new Promise((resolve) => {
      setTimeout(() => {
        console.log("setTimeout in promise1"); // 宏任务
        resolve();
      }, 0);
    });
  })
  .then(function () {
    console.log("promise2"); // 微任务
  });

Promise.resolve().then(function () {
  console.log("promise3"); // 微任务
});

console.log("script end"); // 宏任务

输出

script start
asyncFunc start
script end
promise1
promise3
asyncFunc promise resolved
undefined
setTimeout
setTimeout in promise1
promise2

解答

1. 为什么在输出asyncFunc start后会直接输入script end?

  • 这是因为JavaScript的事件循环和任务队列的工作方式。当你调用一个异步函数时,它会立即开始执行,但是当遇到await关键字时,它会将后面的代码(在这个例子中是console.log("asyncFunc promise resolved"))放入微任务队列,并立即返回控制权给主线程。

  • 在主线程中,console.log("script end")是下一个要执行的语句,所以它会立即被执行。只有当主线程的所有同步任务都完成后,才会开始执行微任务队列中的任务。因此,console.log("asyncFunc promise resolved")会在console.log("script end")之后被执行。

  • 这就是为什么你会看到"asyncFunc start"后面立即输出"script end",然后才输出"asyncFunc promise resolved"。

2. “在主线程中,console.log("script end")是下一个要执行的语句,所以它会立即被执行。”为什么不是setTimeout或者是Promise.resolve?

  • 这是因为JavaScript的事件循环机制和任务队列的工作方式。JavaScript有一个主线程用于执行同步任务,以及一个任务队列用于存放异步任务。当主线程的所有同步任务都执行完毕后,才会去任务队列中取出任务来执行。

  • 在你的代码中,console.log("script end")是一个同步任务,因此它会被立即执行。而setTimeoutPromise.resolve().then都是异步任务,它们会被放入任务队列中,等待主线程的同步任务都执行完毕后再执行。

  • 此外,setTimeoutPromise.resolve().then产生的任务分别属于宏任务微任务。在每一轮事件循环中,主线程首先会执行所有的微任务,然后再执行一个宏任务。因此,即使setTimeoutPromise.resolve().then在代码中的位置在console.log("script end")之前,它们也会在console.log("script end")之后执行。

标签:console,log,训练,script,任务,循环,事件,setTimeout,asyncFunc
From: https://www.cnblogs.com/crispyChicken/p/18220511

相关文章

  • CSS3 超实用属性:pointer-events (可穿透图层的鼠标事件)
    1、是什么pointer-events 直译为指针事件,该属性指定在什么情况下某个DOM可以成为鼠标事件的target。简而言之,就是允许/禁止DOM的鼠标事件(click事件、hover事件、mouse事件等鼠标事件)2、具体属性分析用法分析:pointer-events:auto|none|visiblePainted|visibleFill|......
  • 基于最新发表的端到端实时目标检测模型YOLOv10开发构建自己的个性化目标检测系统从零
    在我前面的系列博文中,对于目标检测系列的任务写了很多超详细的教程,目的是能够读完文章即可实现自己完整地去开发构建自己的目标检测系统,感兴趣的话可以自行移步阅读:《基于官方YOLOv4-u5【yolov5风格实现】开发构建目标检测模型超详细实战教程【以自建缺陷检测数据集为例】》......
  • Shell阶段05 循环语句for循环
    循环语句之for循环for变量in取值列表do循环体done但条件为真,则执行循环体,如果条件为假,则结束循环。#取值列表,很多种取值方法,默认以空白字符为分隔符[root@shell01scripts]#vimfor-1.sh#!/bin/bashforiinfile1file2file3doecho"$i"done[root......
  • Go--生成excel表格,循环赋值并避免重复项
    先下载第三方依赖包:goget-ugithub.com/xuri/excelize/v2 假设原数据格式为:typeDatastruct{PsastringGroupstringOperatorstring} 将数据插入新生成的execl表格中,并且当group值相同时,只更新该group的operator值,即最终数据中,group没有......
  • TEE 严重内存泄漏事件
    一次压测循环播放几个APK里面DRM视频1小时后会发生失败,现象是TA没有load成功出错log如下[2276.030861][TEE]D/TC:?00tee_ta_init_session_with_context:583Re-openTA37eb0e02-c43d-48a8-a129-a95dd3d43929[2276.030864][TEE]E/TC:100print_oom:200Memoryalloc......
  • huggingface 下载与训练模型时会报 SSLERROR 连接 错误,解决办法如下
    我用方案一解决解决方案方案1:使用代理(需要梯子)在你的Python代码的开头加上如下代码importosos.environ['HTTP_PROXY']='http://proxy_ip_address:port'os.environ['HTTPS_PROXY']='http://proxy_ip_address:port'其中 http://proxy_ip_address:port 中的 ......
  • 使用 CNN 训练自己的数据集
    CNN(练习数据集)1.导包:2.导入数据集:3.使用image_dataset_from_directory()将数据加载tf.data.Dataset中:4.查看数据集中的一部分图像,以及它们对应的标签:5.迭代数据集train_ds,以便查看第一批图像和标签的形状:6.使用TensorFlow的ImageDataGenerator类来创建一个数据增强的......
  • 分清策略的驱动模式:事件驱动概念
    如何理解事件驱动概念?比方说我是一家理发店的店长,我设计好了一套从顾客进店开始的流程我把这套流程交给门口的迎宾人员,请问什么时候这个迎宾人员会去执行这套流程?答案是:客人来了事件驱动其实就是,当某一个事情发生以后,我执行对应的操作。也就是if条件:执行事件判断一下驱动方......
  • 【Java】流程控制(条件语句、循环语句、分支语句和异常处理)
    1、简介流程控制是编程中非常重要的一部分,它决定了程序执行的顺序和逻辑。在Java中,有几种主要的流程控制结构,包括条件语句、循环语句、分支语句和异常处理。2、条件语句2.1简介条件语句用于根据某个条件是否成立来决定执行哪段代码。Java中最常用的条件语句是if语句,if-els......
  • echarts饼图给legend图例增加自定义点击事件
    echarts图例点击会有一个默认的点击事件,会把点击的图例对应的legend取消解决办法legendselectchanged事件中将取消选中的legend动态设置回来,主要代码如下:letchart=echarts.init(document.getElementById('main'),null)//图例点击事件chart.on('legendselectchanged',(pa......