Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

Promise异步递归卡死Chrome进程

  前面的文章有介绍过Chrome的Promise异步执行过快造成的一些问题。现在又出现了另一个更大的问题,如果Promise异步产生了无穷递归,它会卡死整个浏览器(所有Chrome进程)。这应该是理念上不允许的,即使JavaScript死循环也只是卡死当前选项卡而已。
  setTimeout之类的慢异步产生的无穷递归不会卡住任何东西,所以我们以前经常将它们用于动画(虽然现在有requestAnimationFrame了)。但同样是异步,Promise就比这几位凶多了,甚至JavaScript死循环都不敌它。下面这个代码在Chrome上会让所有Chrome进程死掉(所有Chrome窗口,无论是标签页还是独立窗口,测试于Chrome37@Windows7),由于存在一定危险性,这里就不做在线执行了
  警告:在Chrome上测试此代码前请做好进程崩溃的心理准备
(function callee(){
  Promise.resolve().then(callee);
})();
  其实Chrome里的死循环并不可怕,因为它已经被浏览器预料,造成的影响是很有限的,关于这点可以看看之前的另一篇文章“死循环已经无法阻止CSS3动画执行了”。而普通的无穷递归也并不可怕,因为它也被浏览器预料,会抛出堆栈满的错误

  正因为Promise被掺入了异步的概念,所以它不被目前的浏览器所预料,导致了进程奔溃的情况。当然,这应该属于目前Chrome的BUG。但其它浏览器上(包括NodeJS)虽然进程不会被卡死,这样的空递归也会占用大量系统资源。我想将来的版本中对于这样的快速异步递归也会被抛出堆栈溢出之类的错误,这应该和setImmediate定义到一起吧。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^