【前端】我可能学了个假的promise!

90%的JavaScript开发者对于异步性有一个误解。(我自己也是在去年才明白的 😅)

看一下下面的简单代码:

 

console.log("在异步函数之前");
loopMillionTimes().then(() => console.log("返回的Promise"));
console.log("在异步函数之后");

async function loopMillionTimes() {
  for (let i = 0; i <= 1000_000; i++) {
    // 一些简单的操作
  }
  console.log("循环完成");
}

 

loopMillionTimes 函数是一个异步函数,因此它返回一个Promise。

那么你期望运行上面的代码会输出什么呢? 。 。 。 你可能最初期望的是: “ 在异步函数之前 在异步函数之后 循环完成 返回的Promise ”

但是如果你实际运行它,你会惊讶地发现它是: ” 在异步函数之前 循环完成 在异步函数之后 返回的Promise “

“为什么呢? loopMillionTimes 返回一个Promise,所以它不应该阻塞主线程!”

嗯……

那是因为要使代码异步,它必须使用异步API。 返回一个Promise并不能神奇地将同步代码变成异步代码。 它也不能神奇地使JavaScript多线程。

JavaScript是单线程的。因此,为了同时执行两个任务,它要求某个外部API执行某些操作,而在等待结果的同时,它继续执行并使用其主线程执行其他操作。

外部API的例子是什么呢?

  • setTimeout和setInterval。
  • fetch。
  • Web Storage
  • Web Sockets
  • 读取磁盘上的文件。

这些功能从未是JavaScript语言核心的一部分,它们由某个外部运行时(如浏览器)提供,并由浏览器处理。

JavaScript只是调用此API的命令并获取结果。

因此,在我们上面的示例中,即使函数是异步的并返回一个Promise,它并未使用任何外部API,所有的代码都需要由JavaScript主线程运行,因此它是阻塞的。🤯

“好的,但是我们如何能够执行同步的长时间任务,比如计算一个大素数或循环一百万次,而不会阻塞主线程一分钟呢?”

这是我将在不久的将来的另一篇文章中讨论的,敬请关注。

如果你觉得这篇内容有用,请留下一个👍。

下次见,👋

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值