JS 的 async await 使用 内部实现 首先会打印 0 执行 foo 函数,遇到 async ,保存当前调用栈
使用
async function
声明创建一个异步函数。函数体内允许使用await
关键字,这使得我们可以更简洁地编写基于 promise 的异步代码,并且避免了显式地配置 promise 链的需要
function resolveAfter2Seconds() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('resolved');
}, 2000);
});
}
async function asyncCall() {
console.log('calling');
const result = await resolveAfter2Seconds();
console.log(result);
// Expected output: "resolved"
}
asyncCall();
内部实现
async function foo() {
console.log(1)
let a = await 100
console.log(a)
console.log(2)
}
console.log(0)
foo()
console.log(3)
首先会打印 0
执行 foo 函数,遇到 async ,保存当前调用栈信息,进入 foo 协程。
打印 1。执行到 await 100 这行时,会创建一个 Promise 对象 promise_
协程是线程上的更轻量级的任务,一个线程可以有多个协程,但同时只能执行一个
(JS引擎会将 resolve 任务交给微任务)
然后将控制权交给父协程,将 promise_ 也传给父协程,父协程调用 promise_.then 来监控 Promise 的状态变化
let promise_ = new Promise((resolve,reject){
resolve(100)
})
父协程执行 console.log(3),父协程结束前进入微任务检查点,在微任务队列发现 resolve(100),执行它并触发 promise_.then,父将控制权交给 foo 协程,同时传递 value (也就是100)
promise_.then((value)=>{
//回调函数被激活后
//将主线程控制权交给foo协程,并将vaule值传给协程
})
继续执行 console.log(a) 和 console.log(2)
一句话介绍
主线程(父协程)执行,遇到 async 进入子协程,执行到 await ,创建一个 Promise 对象 p ,将控制权(及 p)还给父协程,父先用 p.then 监控状态(用于返回子协程),然后继续执行父协程的同步代码,结束前检查微任务,执行 resolve 触发 p.then,父将控制权(及 p 的结果)交给子协程
参考:
转载自:https://juejin.cn/post/7423307164046245899