Promise

Promise/Deferred 模型, 是一种异步编程的模式。其他的异步编程的模式,还有async来控制, 叫做流程控制。

现今流行的各大js库,几乎都不同程度的实现了Promise,如dojo,jQuery、Zepto、when.js、Q等,只是暴露出来的大都是Deferred对象。

Callback Hell

  1. var fs = require('fs');
  2. fs.readFile('sample01.txt', 'utf8', function (err, data) {
  3. fs.readFile('sample02.txt', 'utf8', function (err,data) {
  4. fs.readFile('sample03.txt', 'utf8', function (err, data) {
  5. fs.readFile('sample04.txt', 'utf8', function (err, data) {
  6. });
  7. });
  8. });
  9. });

这样的嵌套就是令人憎恶的callback hell。

Promise/A+规范

  • 一个promise可能有三种状态:等待(pending)、已完成(fulfilled)、已拒绝(rejected)
  • 一个promise的状态只可能从“等待”转到“完成”态或者“拒绝”态,不能逆向转换,同时“完成”态和“拒绝”态不能相互转换
  • promise必须实现then方法(可以说,then就是promise的核心),而且then必须返回一个promise,同一个promise的then可以调用多次,并且回调的执行顺序跟它们被定义时的顺序一致
  • then方法接受两个参数,第一个参数是成功时的回调,在promise由“等待”态转换到“完成”态时调用,另一个是失败时的回调,在promise由“等待”态转换到“拒绝”态时调用。同时,then可以接受另一个promise传入,也接受一个“类then”的对象或方法,即thenable对象。

    参考资料

  • JavaScript Promise迷你书

  • Promises/A+: 官方规范。
  • Promises: 第三方个人整理的规范。
  • html5rocks: JavaScript Promises
  • JavaScript Promise启示录
  • 《使用 promise 替代回调函数》
  • Q
  • When.js
  • [翻译] We have a problem with promises

原文: https://leohxj.gitbooks.io/front-end-database/content/javascript-advance/promise.html