第 9 题:Async/Await 如何通过同步的方式实现异步?
JS 在单线程上玩的越来越6,不禁产生这样的思考,如何将同步循环转换成异步循环。在单线程中,异步循环还是很有必要的,如果同步数据量过大,会造成浏览器卡死。
递归
JS 的异步无非那几个 api,我以 settimeout 为例,套一个函数使用递归即可:
const arr = [1,2,3,4,5,6,7]
let count =0
const go= ()=>{
if(count < arr.length){
setTimeout(() => {
console.log(arr[count])
count = count+1
go()
}, 1000);
}
}
go()
利用死循环 api
死循环 api 比如 idleCallback 之类:
const arr = [1,2,3,4,5,6,7]
let count =0
const go = (deadline)=>{
while ((deadline.timeRemaining() > 0 || deadline.timeout) && count < arr.length) {
console.log(arr[count])
count = count + 1
}
}
window.requestIdleCallback(go, { timeout: 1000 })
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(17)
可以参考你不知道的js一书的中册里面的生成器与迭代器章节看看
题目是不是应该改成“如何通过异步的方式实现同步”?
我猜这道题的意思是,async,await 如何通过 同步方式的写法,达到的异步的效果,如
如果是这样的话,那其实就是问 async, await 的实现机制,换句话说就是问 generator 的实现机制,提示一个词 协程
以上一点小见解,可能是错的~
是想考查async/await的实现原理吧?我只知道async/await是使用generator+run函数(自动执行generator),但是详细实现原理目前我还未理解,暂时也还没有看到有人对async/await 的实现原理有通俗易懂的讲解,还有很多细节没搞懂,不知道有没有正确理解题意?
这个题的意思是不是 async/await 如何通过es5 进行实现? 表述的时候可能有问题吧.
通过es5实现的机制主要是通过 while无线循环 + 状态机 进行实现.
Async/Await 如何通过同步的方式实现异步
首先想要更好的理解 Async/Await,需要了解这两个知识点:
背景
首先,js 是单线程的(重复三遍),所谓单线程,
通俗的讲就是,
一根筋(比喻有点过分,哈哈)执行代码是一行一行的往下走(即所谓的同步),如果上面的没执行完,就痴痴的等着(是不是很像恋爱中在路边等她/他的你,假装 new 了个对象,啊哈哈哈,调皮一下很开心),
还是举个
应该是下面这张写法吧(链式):
U waiyu good
@shizhihua666 厉害啊 兄弟
async await 用于把异步请求变为同步请求的方式,第一个请求的返回值作为后面一个请求的参数,其中每一个参数都是一个promise对象
例如:这种情况工作中会经常遇到
setTimeout 主要用户异步队列的形式,当然其中又分为宏观队列以及微观队列(Promise.then,process.nextTick等),比如隔1000ms执行一段逻辑代码(实际中不一定是1000ms后执行,需要考虑主任务的执行时间)
Async/Await就是一个自执行的generate函数。利用generate函数的特性把异步的代码写成“同步”的形式。
具体见这里
这个应该是考察基本使用
@shizhihua666 以同步的方式实现异步,不是说他是同步
Async/Await本来就是异步,那有同步可言
Async/Await 其实是generate函数的语法糖,想搞清楚用同步的方式实现异步只要搞清generate函数内部的机制就好了,不知道对不对- -
where is dalao?
no body?