promise 进阶 —— async / await 结合 bluebird

一、背景


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年提出。

后来演化出别称:futuredelaydeferred,通常可以互换使用。

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+

官方:https://promisesaplus.com/

介绍: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

中文文档:

https://itbilu.com/nodejs/npm/VJHw6ScNb.html

你可能感兴趣的:(promise 进阶 —— async / await 结合 bluebird)