很多人说这个没用,还嘲讽深入理解,没有解决麻烦和任何问题
我举个最简单的例子,python协程的async await,代码如下:
import asyncio
async def sleep(seconds):
await asyncio.sleep(seconds)
async def main(num=0):
# 并发执行多个异步任务
print(num)
await sleep(0.0001)
await main(num + 1)
asyncio.run(main())
输出到1000就会堆栈溢出,而用js的promise实现一样的函数,却不会
然而一旦把sleep去掉,就会立马堆栈溢出
function sleep(time){
return new Promise(resolve => setTimeout(resolve, time));
}
async function main(num=0){
console.log(num)
//去掉sleep会堆栈溢出
await sleep(1);
await main(num+1)
}
main()
因为js中的await实际上等效于then,也就是下面的代码,每次循环都是新的任务提交到事件循环队列,所以不会堆栈累加:
async function main(num=0){
console.log(num)
sleep(1).then(()=>{
main(num+1)
})
}
导致函数堆栈溢出的因素都可以说成不重要。没有任何意义,到底是自己没有认真学,还是真的不重要,各位自行判断吧
不要在说有什么用,有什么应用场景了,手写apply call bind这些面试题有应用场景吗?
单纯为了兴趣研究下,就跟普通promise输出顺序的面试题一样,也可以写个类似的
async function main() {
await {
then(func) {
console.log(1)
setTimeout(func,0);
console.log(2)
}
}
console.log(3)
}
main()
``