Web 技术研究所

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

Chrome的Promise异步是不是快过头了?

  前几天的一篇文章“Promise与setTimeout的异步速度比较”中提到Promise的异步速度比setTimeout快,这并没有问题。但我最近的测试结果中,Promise的异步会造成其它问题,因为它快过头了,甚至隔了个SCRIPT标签的并行代码都不如它快,这就说不过去了。
  下面是问题重现,测试于Chrome37
<script>
var inc=0;
Promise.resolve().then(function(){
  inc++;
  console.log(inc,"Promise回调函数");
});
console.log(inc,"当前SCRIPT标签最后一行");
</script>
<script>
console.log(inc,"另一个SCRIPT标签");
</script>

  这结果就有点意外吧?这Promise异步快得根本停不下来!所有的SCRIPT应该都是在主消息中被解释执行的,由于Promise使用了独立的计时器,导致了和主计时器的执行有出入。如果是setTimeout的话应该是如下结果。
<script>
var inc=0;
setTimeout(function(){
  inc++;
  console.log(inc,"setTimeout回调函数");
});
console.log(inc,"当前SCRIPT标签最后一行");
</script>
<script>
for(var t=Date.now();Date.now()-t<1000;); //将主线程卡住一秒
console.log(inc,"另一个SCRIPT标签");
</script>

  无论主消息执行耗时多久,setTimeout永远会在主消息执行结束之后才执行。
  另外,Firefox中的Promise异步并没有Chrome那样加速的效果,所以也不存在这个问题。Firefox中的Promise异步与setTimeout的结果一致,这里就不截图了。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^