Web 技术研究所

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

Promise 技术细节(5)

  Promise 会一层层地处理 thenable 对象,而 Promise 对象本身也是 thenable 对象,那么就存在 resolve 自身的问题。ES6 的 Promise 确实定义了如果一个 Promise 对象 resolve 了自身就抛异常。但这仅限于 resolve 自身,如果是两个 Promise 对象互相 resolve 呢?
  就 resolve 自身这个问题,在浏览器上的实现也是有差异的。 var promise = new Promise(resolve => { setTimeout(() => resolve(promise)); }); promise.then();   Chrome 确实会抛出异常 Uncaught (in promise) TypeError: Chaining cycle detected for promise #<Promise>   但 Firefox 并不会。这应该算是 Firefox 的 Bug?不过即便是个 Bug,通常也不会影响使用。
  如果是两个 Promise 对象互相 resolve,那结果就不同了。Chrome 只判断了是否 resolve 自身,对于这种情况,Chrome 神奇般地陷入了死循环。这应该算是个比较严重的 Bug 吧? var p1 = new Promise(resolve => { setTimeout(() => resolve(p2)); }); var p2 = new Promise(resolve => resolve(p1)); p1.then( result => console.log(result), reason => console.error(reason) );   按照正常的逻辑,应该是两个 Promise 对象上都被对方挂载了一个 then。但由于互相有依赖,谁都不会 resolve,因此两个 Promise 对象陷入无限地 pending。Firefox 上便是如此的结果。
  为 Firefox 鼓掌欢呼!
网名:
34.203.245.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^