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);

})

}

async function changeColor(color, duration) {

console.log(‘当前颜色’, color);

await sleep(duration);

}

async function main() {

await changeColor(‘红色’, 2000);

await changeColor(‘黄色’, 1000);

await changeColor(‘绿色’, 3000);

}

main();

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

// 写法一

let [foo, bar] = await Promise.all([getFoo(), getBar()]);

// 写法二

最后

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

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

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

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值