JavaScript入门教程

JavaScript简介
JavaScript语法基础
JavaScript流程控制
JavaScript函数
面向对象编程
JavaScript事件
JavaScript DOM
正则表达式
JavaScript BOM
AJAX

专题分析

浏览器兼容性
JS优化
Web前端开发规范
编辑器推荐
总结和笔记

学习助手

对象参考手册
ECMAScript分析
数据中心
QQ交流群

Promise对象简史

Promise 对象曾经以多种形式存在于很多语言中。这个词最先由C++工程师用在Xanadu 项目中,Xanadu 项目是Web 应用项目的先驱。随后Promise 被用在E编程语言中,这又激发了Python 开发人员的灵感,将它实现成了Twisted 框架的Deferred 对象。

2007 年,Promise 赶上了JavaScript 大潮,那时Dojo 框架刚从Twisted框架汲取灵感,新增了一个叫做dojo.Deferred 的对象。也就在那个时候,相对成熟的Dojo 框架与初出茅庐的jQuery 框架激烈地争夺着人气和名望。2009 年,Kris Zyp 有感于dojo.Deferred 的影响力提出了CommonJS 之Promises/A 规范①。同年,Node.js 首次亮相。

Node 早期的几个版本在其非阻塞式API 中用到了Promise。但到了2010 年2 月,Ryan Dahl 决定切换至当时为人所熟知的callback(err, result...)格式,因为Promise 是一种属于“用户之境”的甚高层构造。

Ryan Dahl 的决定为那些以Node 为竞争目标的Promise 实现腾出了舞台,其中就有著名的Kris Kowal 的Q.js和AJ ONeal 的Futures。(在一般性用法中,Promise、Deferred 和Future 这三个词大体可算
作同义词。)Q.js 是Promises/A 规范的一种相当直观的实现。Futures是一种更广泛的工具集,结合了很多在其他库(如Async.js)中才能找到的工作流控制特性。

不过,Promise 今天受到如此多关注的原因当然是jQuery。jQuery 1.5在2011 年1 月携$.ajax 重量级重写之势,用其Promise 实现震惊了无数初次接触Promise 对象的开发者。不过,其他的开发者则忧心忡忡,因为jQuery 1.5 对Promises/A 规范的无视导致了微妙的API 差异。

除了3.7 节之外,本章其余部分的关注点都是jQuery 的Promise 实现。此外还会讲述jQuery 在用语上的不同之处,特别是两点,一是Deferred 与Promise 之间的区别(下一节就会看到),二是resolve用作reject 的反义词。