Web 技术研究所

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

直接 thenable 上!

  之前没有好好看规范,漏过了 Promise 对参数类型的要求,还特意捣鼓了一篇无聊的 Promise 对象检测。如果 Promise 没有要求类型的话,类型检测确实是没有意义的。只需要一个 thenable 对象即可。至此我终于明白了 then 方法在规范真没有要求返回新对象的原因了。

我的纠结点

  当时遇到的问题是这样的。想写一个通用库,这个库的行为是异步的,希望接口函数返回一个 Promise 对象来处理后续操作。但由于原生的 Promise 尚未普及,如果让这个库依赖原生 Promise 的话,使用时再加载一个 Promise 的 Polyfill 就会变得很笨拙,更何况应用环境说不定已经使用了 $q 之类的东西了。那么此时应该怎么办?

thenable 拯救世界

  其实我的纠结是多余的,Promise 的标准中并没有要求接收一个 Promise 实例,而只是要求接收一个 thenable 对象。于是我在自己的库中不需要依赖任何 Promise 库,只需要然函数返回一个 thenable 对象即可。 <script>
function foo(x){
  return {
    then:function(resolve,reject){
      setTimeout(resolve,0,"回调参数"+x);
      return this;
    }
  };
};

Promise.all([foo(1),foo(2)]).then(function(args){
  console.log(args);
});
</script>

then 无需返回新 Promise 对象的苦衷

  在 Promise/A+ 中 then 允许返回自己,所以上面的代码直接 return this 就可以搞定。如果 then 必须返回一个新的 Promise 对象的话,那就不是上面这样几行代码就可以搞定的了,至少得写个异步递归吧?其实 then 的链式调用在 Promise/A+ 上是未定义行为,只有到 ES6 的 Promise 和 $q 之类的具体实现规范中才确定它的行为。所以对于来历不明的 thenable 对象,链式使用 then 还是要稍微谨慎些的。

网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^