前端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://www.mfbz.cn/a/570091.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vr太阳光参数怎么设置,vr快速渲染方法

VR场景中实现逼真的光照效果,太阳光参数的设置尤为关键。真实的太阳光可提升效果图的质感,论VR太阳光参数的设置技巧,包括光源类型选择、光照强度调整、阴影效果优化等多个方面,喜爱一起来看看vr太阳光真实感设置参数吧。 vr太阳光…

大数据信用风险竟然是这样形成的!查询方法也很简单

在大数据时代背景下,大数据信用风险成为了众多机构关注的焦点。这类风险涵盖了多头借贷、履约行为、联系人以及司法等多个方面。本文将深入解析大数据信用风险的形成原因及其查询方法,让我们一起来探索一下。 大数据信用风险主要表现在以下几个方面&…

Python-GEE遥感云大数据分析、管理与可视化

原文链接:Python-GEE遥感云大数据分析、管理与可视化https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601238&idx2&sn6b0557cf61451eaff65f025d648da869&chksmfa820db1cdf584a76de953b96519704177e6206d4ecd47a2f2fabbcac2f7ea619b0bce184…

Ubuntu镜像下载与安装2024.4版本(超适合新手)

前言: 在VMware中安装Ubuntu镜像,首先需要去下载镜像,但是由于服务器在国外,下载速度相对较慢,国内也有镜像,较推荐在国内镜像站下载,例如阿里镜像和清华镜像。 官网:Ubuntu系统下…

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第八套

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第八套 部分题目分享,完整版带答案(有答案和解析,答案非官方,未仔细校正,仅供参考)(共十套)获取(WX:didadidadidida313&#xff0c…

hover显示播放遮罩层效果

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

vLLM-prefix浅析(System Prompt,大模型推理加速)

原文:vLLM-prefix浅析(System Prompt,大模型推理加速) 简介 本文浅析了在大模型推理加速方面一个非常优秀的项目 vLLM 的一个新特性 Prefix。在 Prompt 中有相同前缀时可以提高吞吐量降低延迟,换句话说可以省去这部分…

【做算法学数据结构】二叉树的层序遍历【二叉树】

文章目录 题目二叉树二叉树描述二叉树的java描述和前序遍历、后序遍历、中序遍历 题解总结以及二叉树应用场景 题目 给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历…

德思特GNSS模拟器为物流行业保驾护航

作者介绍 一、前言 德思特GNSS模拟器能够在最短的时间内高效、准确的协助完成虹科MSR运输数据记录仪的定位准确性以及抗干扰能力测试,确保在运输或存储过程中,让用户知道何时何地发生了超出预设公差范围的事件,快速、准确的记录定位数据&…

【UE 材质】水波纹效果

效果 模拟雨水打落在水面上的效果 步骤 1. 下载所需纹理和纹理 纹理2. 新建一个材质,这里命名为“M_WaterRipples” 打开“M_WaterRipples”,添加一个纹理采样节点,纹理使用第一步下载的纹理 将纹理采样节点的R通道连接到基础颜色&#x…

李沐57_长短期记忆网络LSTM——自学笔记

LSTM 1.忘记门:将值朝着0减少 2.输入门:决定不是忽略掉输入数据 3.输出门:决定是不是使用隐状态 !pip install --upgrade d2l0.17.5 #d2l需要更新首先加载时光机器数据集。 import torch from torch import nn from d2l import torch a…

Ajax和axios基础

AJAX Asynchronous JavaScript And XML 异步的JavaScript和XML 作用 数据交换: 通过Ajax可以给服务器发送请求,服务器将数据直接响应回给浏览器. 异步交互: 可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术. 同步和异步 同步发送请求: 浏览器发…

阿斯达年代记账号注册教程 阿斯达年代记苹果id注册教程

阿斯达年代记账号注册教程 阿斯达年代记苹果id注册教程 即将开服的新款大型多人角色扮演类游戏阿斯达年代记三强争霸将于4月24号上线,小伙伴们可以在本次开服之后进行游戏,这款游戏除了常规的职业分化之外,目前开放了四种角色供玩家选择&…

getopt, getopt_long使用笔记

An element of argv that starts with - (and is not exactly "-" or "--") is an option element. The characters of this element (aside from the initial -) are option characters. 以-’开头的字符(注意!不是字符串!!)就是命令行参数选项 通…

C++中的程序流程结构

一、选择结构 1.1 if语句 作用&#xff1a;执行满足条件的语句 if语句的三种形式 单行格式if语句多行格式if语句多条件的if语句 #include <iostream> using namespace std;int main(){//选择结构 单行if语句//用户输入分数&#xff0c;如果分数>600,视为考上一本大…

代码随想录 Day19 字符串 | LC28 实现strStr() 【KMP经典题目】

六、实现strStr() 题目&#xff1a; 力扣28&#xff1a;找出字符串中第一个匹配的下标 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack…

全身照怎么缩小做头像?在线图片改大小尺寸的方法

在日常工作中&#xff0c;有不少人喜欢把自己的全身照作为微信或者QQ头像&#xff0c;这时候就经常遇到一个问题&#xff0c;就是图片尺寸太大&#xff0c;无法完整的展现&#xff0c;那么这个时候该怎么处理呢&#xff1f;可以试试下面介绍的这个在线图片改大小尺寸的方法&…

上位机图像处理和嵌入式模块部署(树莓派4b的一种固件部署方法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 如果软件开发好了之后&#xff0c;下面就是实施和部署。对于树莓派4b来说&#xff0c;部署其实就是烧录卡和拷贝文件。之前我们烧录卡&#xff0c;…

YashanDB连获多项权威认证

近期&#xff0c;YashanDB产品能力再获认可&#xff0c;顺利通过多项权威测试认证&#xff0c;包括通过《数据库政府采购需求标准(2023年版)》测评&#xff1b;通过国密检测机构测试&#xff0c;产品支持GB/T38636-2020《信息安全技术传输层密码协议(TLCP)》国标协议&#xff1…

BRC铭文NFT铸造质押挖矿系统开发运营

区块链技术的不断演进与应用拓展&#xff0c;为数字资产领域带来了更多可能性。BRC铭文NFT铸造质押挖矿系统的开发与运营&#xff0c;将为用户提供一种全新的数字资产体验&#xff0c;下文将介绍其版/需求方案/逻辑项目。 1. 系统概述 BRC铭文NFT铸造质押挖矿系统旨在结合区块…
最新文章