Web 技术研究所

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

关于 Promise 的检测

  ES6 把 JavaScript 的 Promise 规范了一下,所以现在很多新框架都按 ES6 的规范来了。比如 Angular 2.0 好像就不再使用 $q 而直接使用 ES6 的 Promise 了。但 ES6 的普及程度目前依然很有限,为了兼容一些早期的框架,我们就得考虑各种 ES6 之外的 Promise 实现。
  那么问题来了,如何判断一个对象是不是 promise 对象呢?最简单粗暴的方法就是判断有没有 then 方法,如果有就认为它是一个 promise 对象。 function isPromise(e){
  return !!e&&typeof e.then=="function";
};
  虽然 ES6 的 promise 对象还有 catch 方法之类的东西,但如果以 Promise/A+ 来看,只有 then 方法是必须的。而且 thenable 的定义仅仅是对象存在 then 方法。这个定义我觉得真是太蛋疼了,好歹也应该有个像 AMD 的 define.amd 那样的东西吧?总之就目前来看确实找不到一个完美的判断方法,仅判断 then 方法是否存在就已经非常好了。
  上面那简单粗暴的代码还是有点问题的,因为观察可能产生副作用。不过这点问题不足以影响使用,如果一个库使用了 then 作为属性名还将其作为访问器属性那也真是醉了,这一定是库的设计出了问题!如果不考虑副作用的话,其实还可以试着调用 then,因为调用 then 后返回的结果依然还是 promise 对象,它同样有 then 方法。但这个的副作用可能就比较大,所以我觉得也不该做到这么彻底。就正常使用的程度,上面的代码已经足够了。如果非要纠结,那就应该去给规范提 ISSUE 了。
网名:
34.203.245.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^