Node.js中的async和await关键字是用于处理异步操作的新特性。这两个关键字实际上是基于Promise的封装,它们能够使得代码看起来更加简洁易懂,同时也能解决回调地狱等问题。async和await在执行过程中会产生微任务和宏任务,这两个概念对于理解异步编程非常重要。
async和await的基本用法
async函数是ES7中的新语法,用来表示一个异步函数。async函数返回一个Promise对象,这个Promise对象的状态和返回值都是由异步任务的结果决定的。
async function fetchData() {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
return data;
}
fetchData().then(data => console.log(data));
在上面的例子中,fetchData函数中的await关键字会将异步任务转换成一个同步的代码块,直到异步任务完成后才会执行下面的代码。fetchData函数返回一个Promise对象,因此我们可以通过.then方法来获取该Promise对象的状态和返回值。
微任务和宏任务
在JS中,异步操作会产生微任务和宏任务。微任务和宏任务是异步任务被执行时产生的任务队列,执行的顺序是先微任务后宏任务。
微任务
微任务一般来说是比较短的异步操作,优先级比宏任务要高。常见的微任务有Promise和MutationObserver中的回调函数。
async function asyncFn() {
console.log('asyncFn start');
const result = await new Promise(resolve => {
setTimeout(() => {
console.log('resolve promise');
resolve('result');
}, 0);
});
console.log(result);
}
asyncFn();
console.log('end');
在上面的例子中,asyncFn函数中的await任务在Promise对象的回调函数中执行,此时的Promise回调函数就是一个微任务。因此在执行之后,控制台会先输出'asyncFn start'、然后是'resolve promise'、接着是'result'、最后是'end'。
宏任务
宏任务一般来说是比较长的异步操作,例如setTimeout、setInterval、XMLHttpRequest等。这些异步任务产生的回调函数会被加入到宏任务队列中,等待主线程空闲时执行。
async function asyncFn() {
console.log('asyncFn start');
setTimeout(() => {
console.log('setTimeout');
}, 0);
const result = await new Promise(resolve => {
console.log('inside promise');
resolve('result');
});
console.log(result);
}
asyncFn();
console.log('end');
在上面的例子中,asyncFn函数中的setTimeout是一个宏任务,因此会等待主线程执行完全部的同步代码之后再执行。因此在执行之后,控制台会先输出'asyncFn start'、然后是'inside promise'、接着是'end'、最后是'setTimeout'。
总结
通过以上两个例子,我们可以理解async和await如何利用Promise来处理异步操作,并且掌握微任务和宏任务的概念。在具体的开发中,我们需要根据具体的任务特点来确定是否使用async和await以及如何利用微任务和宏任务来组织代码。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.js中的async 和 await 关键字微任务和宏任务 - Python技术站