Web 技术研究所

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

jQuery 的 Deferred 也有「脱衣」特性

  请原谅我读书少,不知道这种特性的学名叫什么。因为之前在一篇介绍 ES6 Promise 这个特性的文章中我管它叫「脱衣」,所以这里姑且也称它为「脱衣」好了。虽然我以前也写过 jQuery 的 Deferred 相关文章,但当时好像完全在抄文档,一点都不细致。
  其实之前我也不知道 jQuery 的 Deferred 有这么凶残的特性,直到最近项目中有需求并用上了才发现的。先看看 ES6 的 Promise 吧,它可以这么用 <script>
Promise.resolve().then(function(){
  // 这里是一个 resolve 环境
  // 在这个环境中 return 一个 promise 可以在外层得到处理
  return Promise.reject(123);
}).catch(function(e){
  // 这是在上一个处理中返回的 promise 对象 reject 的结果
  // 总体的感觉仿佛 promise 脱了一件衣服似的
  console.log(e); // 123
});
</script>
  jQuery 的 Deferred 虽然不能在 done 或 fail 中左右后续的成败调用方向,但在 pipe 中完全可以。于是我们可以写出和上面类似的代码 <script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>
$.Deferred(function(deferred){
  deferred.resolve();
}).pipe(function(){
  // 这里是一个 resolve 环境的 pipe
  // 在这个环境中 return 一个 deferred 可以在外层得到处理
  return $.Deferred().reject(123);
}).fail(function(e){
  // 这是在上一个处理中返回的 deferred 对象 reject 的结果
  // 总体的感觉仿佛 deferred 脱了一件衣服似的
  console.log(e); // 123
});
</script>
  也就是说,Deferred 同样可以处理复杂逻辑,实用性一点也不必 Promise 差。它们各有优缺点吧,Deferred 对异常的处理不太友好,而 Promise 的 catch 这个方法名对低版本 IE 不太友好。如果不考虑兼容问题的话确实 Promise 好用一些,但要兼容 IE8,而且项目自带 jQuery 了,所以用 Deferred 更划算。
网名:
34.203.213.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^