async原理解析,大佬整理

console.log(f1.toString());

console.log(f2.toString());

};

可以发现,async函数就是将Generator函数的星号(*)替换成async,将 yield替换成 await,仅此而已。

async函数是基于 Generator的改进,体现在以下4点

  1. 内置执行器。Generator函数的执行必须靠执行器。所以才有了 Thunk函数和co模块,而 async函数自带执行器。async函数的执行和普通函数一样。

asyncReadFile();

  1. 更好的语义。asyncawait,比起星号和yield,语义更清楚了。async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果。

  2. 更广的适应性。即使 Generator函数可以借助co模块自动执行,但是co模块后面只能是Thunk函数或Promise对象,而async函数的await命令后面,可以是 Promise对象和原始类型的值(数值、字符串和布尔值,但这是会自动转成立即 resolvedPromise对象

  3. 返回值是 Promise。aysnc函数返回值为 Promise,这比Generator函数的返回值是Iterator对象方便多了。

async函数完全可以看作多个异步操作,包装成的一个Promise 对象,而await命令就是内部then命令的语法糖。

总是就是 Generator 函数虽然是JS借鉴其他语言,根据JS本身单线程的特点实现的协程,但是使用起来会麻烦很多,而 async函数就是为了解决这些重复的事情而生的。其实  async函数就是将Generaor函数和自动执行器包装了在了一起,然后润色了一下。

async函数的实现原理


就是将Generator函数和自动执行器,包装在一个函数里。

async function fn(args) {

// …

}

function fn(args) {

return spawn(function* () {

// …

})

}

所有的 async 函数都可以写成上面的第二种形式,其中 spawn 函数就是自动执行器。

function spawn(genF) {

return new Promise(function(resolve, reject) {

const gen = genF();

function step(nextF) {

let next;

try {

next = nextF();

} catch(e) {

return reject(e);

}

if(next.done) {

return resolve(next.value);

}

Promise.resolve(next.value).then(function(v) {

step(function() { return gen.next(v); });

}, function(e) {

step(function() { return gen.throw(e); });

});

}

step(function() { return gen.next(undefined); });

});

}

常见的关于async的笔试题


  • 实现一个sleep

  • 实现一个红绿灯:红灯2秒,黄灯1秒,绿灯3秒

  • 使用 async 实现Promise.all()的效果

实现一个 sleep


每隔1秒输出 1, 2, 3, 4, 5

function sleep(interval) {

return new Promise(resolve => {

setTimeout(resolve, interval);

})

}

// 用法

async function one2FiveInAsync() {

for (let i = 1; i <= 5; i++) {

console.log(i);

await sleep(1000);

}

}

one2FiveInAsync();

实现一个红绿灯

红灯2秒,黄灯1秒,绿灯3秒

function sleep(duration) {

return new Promise(resolve => {

setTimeout(resolve, duration);

})

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取(备注前端)
img

最后

在面试前我花了三个月时间刷了很多大厂面试题,最近做了一个整理并分类,主要内容包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。

包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。

  • HTML5新特性,语义化

  • 浏览器的标准模式和怪异模式

  • xhtml和html的区别

  • 使用data-的好处

  • meta标签

  • canvas

  • HTML废弃的标签

  • IE6 bug,和一些定位写法

  • css js放置位置和原因

  • 什么是渐进式渲染

  • html模板语言

  • meta viewport原理

nvas

  • HTML废弃的标签

  • IE6 bug,和一些定位写法

  • css js放置位置和原因

  • 什么是渐进式渲染

  • html模板语言

  • meta viewport原理

  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js的async原理主要基于事件循环机制和回调函数。在JavaScript中,事件循环是一种用于处理异步操作的机制,它以事件的方式管理和触发异步任务的执行。 在Node.js的异步编程中,可以使用async函数和await关键字来处理异步操作。通过async函数的声明,可以将一个普通函数转化为一个异步函数,而await关键字可以等待一个Promise对象的解析结果,然后将其返回。 当调用一个异步函数时,它会立即返回一个Promise对象,表示该异步操作的状态。然后,事件循环会将该异步操作放入事件队列中,并继续执行后续的代码。 当事件队列中的异步操作达到可执行状态时,事件循环会将其取出并执行。一旦异步操作执行完成,如果有回调函数,则将回调函数放入回调队列中,等待下一个事件循环周期的执行。 回调队列中的回调函数会按照队列的顺序依次执行,每次执行一个,直至队列全部执行完毕。在回调函数执行过程中,可以通过回调函数的参数获取到异步操作的结果,并进行后续的处理。 通过事件循环和回调函数的配合,Node.js能够实现高效的异步编程,避免了回调地狱的问题。通过合理地利用异步函数和await关键字,可以在编写代码时更加优雅和简洁。 总结起来,Node.js的async原理主要是基于事件循环和回调函数的机制,通过异步函数和await关键字的配合,实现了高效的异步编程。这种机制可以让开发者更好地管理和处理异步操作,提高代码的可读性和维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值