首页 > 其他分享 >EventLoop中的async和await

EventLoop中的async和await

时间:2022-09-18 19:11:41浏览次数:81  
标签:function async1 console log EventLoop async await

直接先来看一道题:

async function async1() {
  console.log('async1 start')
  await async2()
  console.log('async1 end')
}
async function async2() {
  console.log('async2')
}
console.log('script start')
setTimeout(function() {
  console.log('setTimeout0')
}, 0)
setTimeout(function() {
  console.log('setTimeout3')
}, 3)
setImmediate(() => console.log('setImmediate'))
process.nextTick(() => console.log('nextTick'))
async1()
new Promise(function(resolve) {
  console.log('promise1')
  resolve()
  console.log('promise2')
}).then(function() {
  console.log('promise3')
})
console.log('script end') 

按照“正常”的理解 一般会认为输出结果为:

script strat                        但实际上的结果为:script strat
async1 start               async1 start
async2                  async2
*async1 end               promise1
promise1                 promise2
promise 2                script end
script end                   nextTick
nextTick                  async1 end
promise 3                  promise3
setTimeout0                 setTimeout0
setImmediate               setImmediate
setTimeout3                 setTimeout3 

问题的关键就在于怎么理解为什么 async2 之后输出的不是 async1 end 而是promise1。

这里我直接说下个人理解的结论,

1.async函数会返回一个promise对象

2.async函数遇到await,时执行完await的任务后会先返回,等到await表达式中的 Promise 解析完成后继续执行 async 函数并返回解决结果

3.await表达式中的 Promise 解析完成是指await时会向本轮循环的微任务队列中添加一个空的promise回调,待回调完成即代表Promise 解析完成

根据上述三点再来看问题中的代码。

 

 

至于其他的细节可以参考这篇文章:http://www.inode.club/node/event_loop.html#%E8%AF%A6%E7%BB%86%E8%AE%B2%E8%A7%A3

标签:function,async1,console,log,EventLoop,async,await
From: https://www.cnblogs.com/qkq505/p/16705492.html

相关文章

  • TransmittableThreadLocal和@Async优雅的记录操作日志
    此文主要讲解:如何实现操作记录如何将TransmittableThreadLocal和@Async搭配使用TransmittableThreadLocal阿里的一个开源组件,为了在使用线程池等会池化复用线程的执行......
  • JS: 模拟async/await语法糖
    不熟悉生成器对象的小伙伴,可查看:Generator、Generator.prototype.next模拟函数:/***模拟async关键字的函数*(不返回Promise对象也是可以的)*@paramgenerator*......
  • js四种异步方法(回调函数、Promise、Generator、async/await)
    由于JS运行环境是单线程的,即一次只能完成一个任务,所以多任务时需要排队。异步可以理解为改变执行顺序的操作,异步任务必须在同步任务执行结束之后,从任务队列中依次取出执行......
  • async-await
    async函数介绍  1、async函数执行结果是:返回一个Promise对象(newPromise) fn返回普通值(只要不抛错返回的promise的状态就是fulfilled)asyncfunctionf......
  • 第 9 题:Async/Await 如何通过同步的方式实现异步
    首先想要更好的理解Async/Await,需要了解这两个知识点:同步异步背景首先,js是单线程的(重复三遍),所谓单线程,通俗的讲就是,一根筋(比喻有点过分,哈哈)执行代码是一行一行的往......
  • 第 8 题:setTimeout、Promise、Async/Await 的区别
    1.setTimeoutconsole.log('scriptstart')//1.打印scriptstartsetTimeout(function(){console.log('settimeout')//4.打印settimeout})//2.......
  • Rust 如何实现 async/await
    目录FutureWake&Context为什么需要executor?什么是waker?async/awaitExecutorWakerstruct到ArcWaketraitFuturesUnordered单线程executor线程池executor总结异......
  • 什么是 EventLoop ?
    EventLoop即事件循环,是指浏览器或Node的一种解决javaScript单线程运行时不会阻塞的一种机制,也就是我们经常使用异步的原理。事件循环的进程模型选择当前要执行的任务队......
  • JS实现异步的方法:回调函数callback、事件监听、setTimeout、Promise、生成器Generato
    所有异步任务都是在同步任务执行结束之后,从任务队列中依次取出执行。回调函数是异步操作最基本的方法,比如AJAX回调,回调函数的优点是简单、容易理解和实现,缺点是不利于代码......
  • C# 手动终止async/await异步方法的几种实现
     终止异步方法的实现主要依靠 CancellationToken类 usingSystem;usingSystem.Net.Http;usingSystem.Threading;usingSystem.Threading.Tasks;namespaceC......