anchor.diff:  [[promise-done]]
   == 什么是 Promise.prototype.done ？
   
  -既存のPromise実装ライブラリを利用したことがある人は、
  -`then` の代わりに使う `done` というメソッドを見たことがあるかもしれません。
  -
  -それらのライブラリでは `Promise.prototype.done` というような実装が存在し、
  -使い方は `then` と同じですが、promiseオブジェクトを返さないようになっています。
  -
  -`Promise.prototype.done` は、<<es6-promises,ES6 Promises>>や<<promises-aplus,Promises/A+>>の仕様には
  -存在していない記述ですが、多くのライブラリが実装しています。
  -
  -このセクションでは、`Promise.prototype.done` とは何か?
  -また何故このようなメソッドが多くのライブラリで実装されているかについて学んでいきましょう。
  -
  -=== doneを使ったコード例
  -
  -実際にdoneを使ったコードを見てみると `done` の挙動が分かりやすいと思います。
  +如果你使用过其它的Promise实现类库的话，可能见过用`done`代替`then`的例子。
  +
  +这些类库都提供了 `Promise.prototype.done` 方法，使用起来也和 `then` 一样，但是这个方法并不会返回promise对象。
  +
  +虽然 <<es6-promises,ES6 Promises>>和<<promises-aplus,Promises/A+>>等在设计上并没有对`Promise.prototype.done` 做出任何规定，但是很多实现类库都提供了该方法的实现。
  +
  +在本小节中，我们将会学习什么是 `Promise.prototype.done` ，以及为什么很多类库都提供了对该方法的支持。
  +
  +=== 使用done的代码示例
  +
  +看一下实际使用done的代码的例子的话，应该就非常容易理解 `done` 方法的行为了。
   
   [role="executable"]
   [source,javascript]
  
positive.code:     console.error(error);
  }
  ----
  <1> この例外はキャッチされない
  
  [NOTE]
  ====
  なぜ非同期の `callback` 内での例外をキャッチ出来ないのかは以下が参考になります。
  
  - http://techblog.yahoo.co.jp/programming/javascript_error/[JavaScriptと非同期のエラー処理 - Yahoo! JAPAN Tech Blog]
  ====
  
  <<promise-prototype-done.js,`Promise.prototype.done`>> をよく見てみると、何も `return` していないこともわかると思います。
  つまり、`done` は「ここでPromise chainは終了して、例外が起きた場合はそのままpromiseの外へ投げ直す」という処理になっています。
  
  実装や環境がしっかり対応していれば、__unhandled rejection__の検知はできるため、必ずしも `done` が必要というわけではなく、
  また今回の<<promise-prototype-done.js,`Promise.prototype.done`>>のように、`done` は既存のPromiseの上に実装することができるため、
  <<es6-promises,ES6 Promises>>の仕様そのものには入らなかったと言えるかもしれません。
  
  [NOTE]
  今回の `Promise.prototype.done` の実装は https://www.promisejs.org/[promisejs.org] を参考にしています。
  
  === 总结
  
  このセクションでは、 https://github.com/kriskowal/q/wiki/API-Reference#promisedoneonfulfilled-onrejected-onprogress[Q] や https://github.com/petkaantonov/bluebird[Bluebird] や https://github.com/cscott/prfun#promisedone--undefined[prfun] 等
  多くのPromiseライブラリで実装されている `done` の基礎的な実装と、`then` とはどのような違いがあるかについて学びました。
  
  `done` には2つの側面があることがわかりました。
  
  * `done` の中で起きたエラーは外へ例外として投げ直す
  * Promise chain を終了するという宣言
  
  <<then-or-catch,then or catch?>> と同様にPromiseにより沈黙してしまったエラーについては、
  デバッグツールやライブラリの改善等で殆どのケースでは問題ではなくなるかもしれません。
  
  また、`done` は値を返さない事でそれ以上Promise chainを繋げる事ができなくなるため、
  そのような統一感を持たせるという用途で `done` を使うことも出来ます。
  
  <<es6-promises,ES6 Promises>> では根本に用意されてる機能はあまり多くありません。
  そのため、自ら拡張したり、拡張したライブラリ等を利用するケースが多いと思います。
  
  その時でも何でもやり過ぎると、せっかく非同期処理をPromiseでまとめても複雑化してしまう場合があるため、
  統一感を持たせるというのは抽象的なオブジェクトであるPromiseにおいては大事な部分と言えるかもしれません。
  
  
  [NOTE]
  ====
  
negative.code: include::lib/promise-prototype-done.js[]
  ----
  
  那么它是如何将异常抛到Promise的外面的呢？其实这里我们利用的是在setTimeout中使用throw方法，直接将异常抛给了外部。
  
  [source,javascript]
  .setTimeout的回调函数中抛出异常
  ----
  try{
      setTimeout(function callback() {
  