一、背景
1、Node.js 异步控制
在之前写的 callback vs async.js vs promise vs async / await 里,我介绍了 ES6 的 promise 和 ES7 的 async / await 的基本用法。
可以肯定的是,node.js 的异步控制(asynchronous JavaScript),promise 就是未来的主流,诸如 async.js 等非 promise 库( async.js 基于 callback )终将被淘汰,而基于 promise 的第三方库(Q、when、WinJS、RSVP.js)也会被 async / await 写法取代。
延伸阅读:知乎 - nodejs异步控制「co、async、Q 、『es6原生promise』、then.js、bluebird」有何优缺点?最爱哪个?哪个简单?
2、已经有 ES6 Promise + async / await 了,为什么还要用 bluebird ?
但目前基于 async / await 的 promise 写法还不是很强大。这里可以考虑用 bluebird
,它是一个第三方的 Promise 库,比 async / await 更早诞生,但是完全兼容,因为他们都是基于 Promises/A+
的标准(下文会介绍)。
很多第三方的 promise 库都是兼容 ES6 promise 的,比如 Q 。
二、Promise 进阶
1、Promise 前世今生
(1)定义
They describe an object that acts as a proxy for a result that is initially unknown, usually because the computation of its value is not yet complete.
有道翻译:他们描述了一个对象,该对象充当最初未知的结果的代理,通常是因为其值的计算尚未完成。
“代理”这个词用的挺好的。
(2)历史
promise
一词由丹尼尔·福瑞得曼和 David Wise 在1976年提出。
后来演化出别称:future
、delay
和 deferred
,通常可以互换使用。
promise 起源于函数式编程和相关范例(如逻辑编程 ),目的是将值(future)与其计算方式(promise)分离,从而允许更灵活地进行计算。
应用场景:
并行化计算
分布式计算
编写异步程序,避免回调地狱
(3)各语言支持
现在主流的语言对 future/promise 都有支持。
Java 5 中的 FutureTask(2004年公布)
.NET 4.5 中的 async / await
Dart(2014)
Python(2015)
Hack(HHVM)
ECMAScript 7(JavaScript)
Scala
C++ 草案
……
2、Promises/A+
介绍:An open standard for sound, interoperable JavaScript promises—by implementers, for implementers.
可以理解成 javascript 中 关于 promise 的实现标准。
3、 拓展 - jQuery 中的 Promise
(1)介绍
从 jQuery 1.5.0 版本开始引入的一个新功能 —— deferred
对象。
注意:Deferred 虽然也是一种 promise 的实现,但是跟 Promise/A+ 并不兼容。
但可以将其转为标准的 promise,例如:
var jsPromise = Promise.resolve($.ajax('/whatever.json'))
(2)用法
因为 jQuery 现如今很少用到了,仅简单介绍下 deferred 的用法吧。
1、以 ajax 操作为例:
$.ajax()
操作完成后,如果使用的是低于1.5.0版本的 jQuery,返回的是 XHR 对象,你没法进行链式操作;如果高于 1.5.0 版本,返回的是 deferred 对象,可以进行链式操作。
# old
$.ajax({
url: "test.html",
success: function(){
alert("哈哈,成功了!");
},
error:function(){
alert("出错啦!");
}
});
# new
$.ajax("test.html")
.done(function(){ alert("哈哈,成功了!"); })
.fail(function(){ alert("出错啦!"); });
2、其它
$.when()
类似 promise.all()deferred.resolve()
、deferred.reject()
类似 Promise.resolve()、Promise.reject()……
三、bluebird
1、介绍
英文文档:
http://bluebirdjs.com/docs/api-reference.html
中文文档: