我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Node.js中的async 和 await 关键字微任务和宏任务

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Node.js中的async 和 await 关键字微任务和宏任务

async 和 await 关键字

async 和 await 是 ES2017 中提出来的,async 和 await 两个关键字的出现,简化的 Promise 的使用。

async 关键字

async关键字使用比较简单,所以 async 的使用注意以下三点即可 :

  • async 用于修饰一个 function
  • async 修饰的函数,总是返回一个 Promise 对象
  • 函数内的所有值,将自动包装在 resolved 的 promise 中
// async 用于修饰一个 function
//     1. async 修饰的函数,总是返回一个 Promise 对象
//     2. 函数的返回值,将自动包装在 resolve 的 promise 中

// 1. async 修饰的函数,总是返回一个 Promise 对象
async function fn() {
    // 2. 函数的返回值,将自动包装在 resolve 的 promise 中
    return '哈哈哈';
}
// 以后看一下博客文章之类的东西,里面会有一些变量使用 :foo 和 bar , 无意义;
const foo = fn();
console.log(foo);
foo.then(res => {
    console.log(res);
});

// 注意: async修饰的函数被称为异步函数,可他不是异步执行;
console.log('我是最后一行代码');

await关键字

await关键字比较繁琐,注意点比较多。首先,await 只能出现在 async 函数内,await 让 JS 引擎等待直到promise完成并返回结果,语法:

let value = await promise对象; // 等待promise对象的结果,然后将结果赋值给 value

由于await需要等待promise执行完毕,所以 await会 暂停函数的执行,但不会影响其他同步任务。

所以,await总结如下四点:

  • await只能出现在异步函数中!
  • await能停止代码执行,让后面的同步代码,先执行;
  • await后面跟随的是一个promise对象;
  • await返回的是: Promise对象中的then()中的回调函数中的参数res;
// 定义一个方法,为的就是返回一个 Promise 对象,让下面的await使用;
async function getPromise() {
    return '哈哈哈';
}
console.log(1);
// 1.await只能出现在async修饰的函数中!
async function fn() {
    console.log(2);
    // 2.await后面跟随的是一个promise对象;
    // 3.await返回的是: Promise对象中的then()中的回调函数中的参数res;
    const str = await getPromise();
    console.log(str);
    // 4.await能停止代码执行,让后面的同步代码,先执行;
    console.log(3);
}
// 调用
fn();
console.log(4);
// // 以前用法: 
// axios().then(res => {
//     res.data.map()
// });
// // 以后用法: 
// async function name() {
//     let res = await axios();
//     res.data.map();
// }

async 和 await 解决回调地狱

// async 和 await 解决回调地狱也要用到 then-fs ,因为他直接返回 Promise 对象;
​
// 导入 then-fs
import thenFs from 'then-fs';
​
// await 一定要出现在异步函数中
async function fn() {
    let str1 = await thenFs.readFile('./txt/a.txt', 'utf8');
    console.log(str1);
    let str2 = await thenFs.readFile('./txt/b.txt', 'utf8');
    console.log(str2);
    let str3 = await thenFs.readFile('./txt/c.txt', 'utf8');
    console.log(str3);
}
​
// 调用函数
fn();

JS执行机制(事件循环)

  • js代码开始执行后,主线程执行栈中会把任务分为两类.
  • 一类是同步任务, 一类是异步任务; 主线程执行栈优先执行同步任务,
  • 异步任务会被放入特定的处理程序中,满足条件后,被放到消息(任务/事件)队列中,
  • 主线程执行栈中所有的同步任务执行完毕之后,通过事件循环去消息(任务/事件)队列中,
  • 挑选优先满足条件的程序,放入主线程执行栈中执行。事件循环,周而复始,一直执行。

微任务和宏任务

在ES3 以及以前的版本中,JavaScript本身没有发起异步请求的能力,也就没有微任务的存在。在ES5之后,JavaScript引入了Promise,这样,不需要浏览器,JavaScript引擎自身也能够发起异步任务了。 ​ Tick会触发浏览器渲染,Promise不会触发,所以更加轻量级,多使用;

宏任务

(macro)task,可以理解是每次执行栈执行的代码就是一个宏任务

  • 主线程上的执行栈中所有的代码块
  • setTimeout
  • setInterval
  • Ajax
  • 事件

微任务

微任务(microtask)是宏任务中的一个部分,它的执行时机是在同步代码执行之后,下一个宏任务执行之前。

总结起来,微任务有:

  • Promise.then
  • process.nextTick(Node.js 环境)

宏任务和微任务执行机制

JS优先执行同步任务,然后执行微任务,最后执行宏任务。

总结:Promise中的then()比大部分异步代码,优先执行!

// 结论: 如果同一时间既有宏任务又有微任务触发,那么优先执行微任务;
//     宏任务是宿主发起的会触发重构,比较浪费资源,后执行;
//     微任务是js解释器发起的不会触发重构,比较节省资源,先执行;
// 宏任务
setTimeout(() => {
    //执行后 回调一个宏事件
    console.log('1')
}, 0)
// 同步代码
console.log('2');
// 同步代码
new Promise((resolve) => {
    console.log('3');
    resolve()
// 微任务
}).then(() => {
    console.log('4');
// 微任务
}).then(()=>{
    console.log('5')
})
// 同步代码
console.log('6')
// 2  3   6   4   5   1

到此这篇关于Node.js中的async 和 await 关键字微任务和宏任务的文章就介绍到这了,更多相关Node.js async 和 await 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Node.js中的async 和 await 关键字微任务和宏任务

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Node.js中async和await关键字如何使用

本篇内容主要讲解“Node.js中async和await关键字如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js中async和await关键字如何使用”吧!async 和 aw
2023-07-02

JavaScript中宏任务和微任务有哪些

小编给大家分享一下JavaScript中宏任务和微任务有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、微任务有哪些Promiseawait和async2、
2023-06-25

JavaScript中的宏任务和微任务执行顺序

在 JavaScript 中,宏任务和微任务是指在执行代码的过程中的两种不同的任务类型,这篇文章主要介绍了JavaScript中的宏任务和微任务执行顺序,需要的朋友可以参考下
2022-12-27

深入理解JavaScript中的宏任务和微任务机制

JavaScript中的任务分为宏任务和微任务,它们的执行顺序会影响代码的执行结果。了解它们的机制可以帮助我们更好地理解事件循环和异步编程,避免出现一些意想不到的错误
2023-05-18

JS的执行机制(EventLoop、宏任务和微任务)

这篇文章主要介绍了JS的执行机制(EventLoop、宏任务和微任务),具有很好的参考价值,希望对大家有所帮助。
2023-01-28

如何进行JavaScript微任务和宏任务的分析

这篇文章将为大家详细讲解有关如何进行JavaScript微任务和宏任务的分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言:js是一门单线程语言,所以它本身是不可能异步的,但是js的宿主
2023-06-22

JavaScript中的宏任务和微任务执行顺序是什么

这篇“JavaScript中的宏任务和微任务执行顺序是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaScript
2023-07-04

vue中的任务队列和异步更新策略(任务队列,微任务,宏任务)

这篇文章主要介绍了vue中的任务队列和异步更新策略(任务队列,微任务,宏任务),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

深入理解JS中的微任务和宏任务的执行顺序及应用场景

JavaScript中的任务分为宏任务和微任务,它们的执行顺序会影响代码的执行结果。了解它们的机制可以帮助我们更好地理解事件循环和异步编程,避免出现一些意想不到的错误
2023-05-19

编程热搜

目录