前端Vue中async/await、promise 和setTimeout工作原理和执行顺序

前端Vue中async/awaitPromise 和 setTimeout 在 JavaScript 中都是处理异步操作的方法,但它们的工作原理和执行顺序有所不同。以下是它们的执行顺序和关系的简要说明:

  1. 同步代码执行:在任何异步操作开始之前,首先会执行所有的同步代码。

  2. setTimeout:setTimeout 设置的回调函数会被放入 JavaScript 的事件队列中,等待当前同步代码执行完毕后才会执行。即使 setTimeout 的延迟设置为 0,它的回调函数也不会立即执行,而是会在同步代码执行完后,等待事件队列空闲时才会执行。

  3. Promise:Promise 对象表示一个异步操作的最终完成(或失败)及其结果值。Promise 的执行顺序依赖于其状态。如果 Promise 已经处于 fulfilled 或 rejected 状态,那么其 .then() 或 .catch() 中的回调函数会立即执行。如果 Promise 还在 pending 状态,那么它的回调函数会被放入微任务队列中,等待当前同步代码和事件队列中的任务执行完毕后才会执行。

  4. async/await:async 函数总是返回一个 Promise 对象。await 关键字用于等待一个 Promise 的解决或拒绝,并返回 Promise 的解决值。async/await 的执行顺序也依赖于 Promiseasync 函数内部的代码会同步执行,直到遇到 await 关键字。在 await 关键字处,async 函数的执行会暂停,并等待 Promise 的解决。一旦 Promise 解决,async 函数的执行会恢复,并继续执行后面的代码。由于 async/await 的执行是基于 Promise 的,因此它们通常会被放入微任务队列中,与 Promise 的回调函数一起执行。

在 JavaScript 中,async/await、promise 和setTimeout的执行顺序如下:


1. 当遇到async函数时,会返回一个promise对象,而不会立即执行其内部代码。当async函数中有await时,会暂停函数的执行,等待await后面的表达式的promise对象完成(要么resolved,要么rejected)。await后面的表达式的promise对象完成后,会根据其状态决定下一步的操作。如果是resolved状态,则将其返回值作为await表达式的结果;如果是rejected状态,则抛出错误。

2. 当遇到Promise对象时,会立即执行其内部代码。Promise的then方法也会被封装成微任务,等待当前宏任务执行完毕后执行。

3. 当遇到setTimeout时,会将回调函数放入不同的等待队列,优先级低于await和promise。当定时器到期后,回调函数会被加入到宏任务队列中等待执行。


根据以上执行顺序,在async/await、promise和setTimeout共存的情况下,微任务优先于宏任务执行。下面是一个代码示例:


// 定义一个 async 函数 async1,在其中使用 await 等待 async2 函数执行完成

async function async1() {   console.log('async1 start');   await async2();   console.log('async1 end');}
// 定义一个 async 函数 async2async function async2() {   console.log('async2');}
// 定义一个 Promise 对象console.log('script start');
setTimeout(() => {   console.log('setTimeOut');}, 0);
async1();
new Promise(function (resolve) {   console.log('promise1');   resolve();}).then(function () {   console.log('promise2');});console.log('script end');

上面代码执行打印顺序:

script startasync1 start async2 promise1script end promise2 async1 endsetTimeOut

上面代码执行顺序说明

1、执行console.log('script start'),输出script start;

2、执行setTimeout,是一个异步动作,放入宏任务异步队列中;

3、执行async1(),输出async1 start,继续向下执行;

4、执行async2(),输出async2,并返回了一个promise对象,await让出了线程,把返回的promise加入了微任务异步队列,所以async1()下面的代码也要等待上面完成后继续执行;

5、执行 new Promise,输出promise1,然后将resolve放入微任务异步队列;

6、执行console.log('script end'),输出script end;

7、到此同步的代码就都执行完成了,然后去微任务异步队列里去获取任务

8、然后执行resolve(new Promise的),输出了promise2。

9、接下来执行resolve(async2返回的promise返回的),输出了async1 end。

10、最后执行setTimeout,输出了settimeout。

欢迎加入“前端组件开发学习”交流群,一起学习成长!可关注  “前端组件开发” 公众号后,私信后申请入群。

d848d5658a07453c843277846948c608.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2982253.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Dynamics365 视图搜索启用/禁用星号模糊搜索

默认该设置是开启的,位置在环境-你对应的组织-设置-特性中 一旦开启,则会阻止你使用*号模糊搜索,你按回车没有任何反应 如果要使用模糊搜索,则将该设置关闭,使用时只有下述这么一段警告,不会阻止你使用 全局…

3DE DELMIA Role: PSFEM - Structure Fabrication Engineer for Marine

Discipline: Process Engineering Role: PSFEM - Structure Fabrication Engineer for Marine 通过结构详细设计生成的基于规则的自动化工作准备,用于管理用于生产的制造可交付成果 所有结构设计零件的基于规则的工作准备和对应的生产可交付成果(工程图、机器数据&…

欢乐钓鱼大师一键钓鱼,解放双手!

《钓鱼欢乐大师》是一款让玩家体验钓鱼乐趣的游戏,在游戏中,玩家可以通过技巧和策略钓到各种各样的鱼。为了提高钓鱼效率,让玩家更快地钓到大鱼,下面将介绍如何利用脚本来优化游戏体验。 第一步:准备工作 创建云机&…

电脑遗失d3dx9_43.dll文件会给电脑带来什么问题,有哪些方法可以解决丢失d3dx9_43.dll文件的办法

电脑遗失了d3dx9_43.dll文件,可能会引发一系列麻烦的后果。那么,针对这种情况,我们应该采取哪些方法来修复丢失的d3dx9_43.dll文件呢?下面将介绍几种解决d3dx9_43.dll文件丢失问题的有效方法。 对d3dx9_43.dll文件的简要介绍 d3d…

Redis篇:缓存更新策略最佳实践

前景: 缓存更新是redis为了节约内存而设计出来的一个东西,主要是因为内存数据宝贵,当我们向redis插入太多数据,此时就可能会导致缓存中的数据过多,所以redis会对部分数据进行更新,或者把他叫为淘汰更合适&a…

1、Flink DataStreamAPI 概述(上)

一、DataStream API 1、概述 1)Flink程序剖析 1.Flink程序组成 a)Flink程序基本组成 获取一个执行环境(execution environment);加载/创建初始数据;指定数据相关的转换;指定计算结果的存储…

Win10 搭建 YOLOv8 运行环境(20240423)

一、环境要求 1、Python,版本要求>3.7 2、PyTorch,版本要求>1.7。PyTorch 是一个开源的深度学习平台,为人工智能研究提供了一个灵活的、易于使用的工具集。YOLOv8 是基于 PyTorch 框架实现的,所以需要安装 PyTorch。 3、CUD…

6步教你APP广告高效变现,收益翻倍秘诀大揭秘!

移动应用广告变现最佳实践与策略指南 在移动应用市场中,广告变现已成为开发者和公司获取收益的重要途径。然而,如何在保证用户体验的同时,实现广告收入的最大化,成为了众多开发者和公司面临的挑战。本文将为您介绍一些最佳的实践…

抖音 小程序 获取手机号 报错 getPhoneNumber:fail auth deny

这是因为 当前小程序没有获取 手机号的 权限 此能力仅支持小程序通过试运营期后可用,默认获取权限,无需申请; https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/guide/open-capabilities/acquire-phone-number-acqu…

工业级POE交换机支持什么?

工业级POE交换机是专为工业环境设计的交换机,它支持以下功能: 1. 以太网交换功能:工业级POE交换机可以提供多个以太网口,用于连接各种设备和终端,实现数据的传输和通信。 2. 电力传输功能:POE(…

C++ / Qt + MySql投标管理系统

目录 一、项目介绍 二、项目展示 三、源码获取 一、项目介绍 1、多角色登录;投标人、招标人、评标专家、系统管理员 2、招标人:发布招标信息 3、投标人:选择招标信息、上传投标文件、以及投标金额 4、评标专家:选择自动唱…

40. 【Android教程】AsyncTask:异步任务

在前面的章节有提到过,Android 系统默认会在主线程(UI 线程)执行任务,但是如果有耗时程序就会阻塞 UI 线程,导致页面卡顿。这时候我们通常会将耗时任务放在独立的线程,然后通过 Handler 等线程间通信机制完…

Laravel 6 - 第九章 契约

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

卓越体验的秘密武器:评测ToDesk云电脑、青椒云、天翼云的稳定性和流畅度

大家好,我是猫头虎。近两年随着大模型的火爆,我们本地环境常常难以满足运行这些大模型的硬件需求。因此,云电脑平台成为了一个理想的解决方案。今天,我将介绍并评测几款主流云电脑产品:ToDesk云电脑、天翼云电脑和青椒…

Mysql--基础知识点--0.1--脏读、不可重复读、幻读

1 脏读、不可重复读、幻读 1.1 脏读 如果一个事务读到了另一个事务已修改且未提交的数据,则发生了脏读现象。 1.2 不可重复读 在一个事务里面多次读取同一个数据,若前后两次读到的数据不一致,则发生不可重复读现象。 1.3 幻读 在一个…

Laravel 6 - 第十四章 响应

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

PMP和华为项目管理认证有哪些区别?

PMP和华为项目管理认证都是项目管理领域的权威认证,那么这两者有哪些区别呢? 01 侧重点不同 PMP主要以理论为主,是一套结构化项目管理思维和方法论,注重传统的项目管理方法和流程,强调项目的计划、执行和控制&#…

hover显示播放遮罩层效果

我们都知道视频列表其实是一个封面列表,鼠标放上去时,有反馈:即hover时显示播放遮罩层,点击,跳转到对应的视频播放页。这是目前主流视频网站的一个通用效果。 我们在实现时应该理清思路: 1、每个视频位置处放的是封面图片 2、播放按钮遮罩层需完全覆盖封面图片,并且正…

Spring三级缓存源码解析

Spring三级缓存 前置知识三级缓存定义SpringBean生命周期 Bean的初始化getSingleton 分析加入一级缓存 CreateBean过程(A)A填充属性BB填充属性A,执行getSingleton(A)B完成初始化 前置知识 三级缓存定义 public class DefaultSingletonBeanRegistry ext…

Vue3 实现 Three.js粒子特效

效果 <template><div id"waves" /> </template><script setup> import { ref, onMounted, onUnmounted } from "vue"; import * as THREE from "three";const amountX ref(50); const amountY ref(50); const color …