anchor.diff:  include::embed/embed-json-promise.js[]
   ----
   
  -渡された値を `JSON.parse` してpromiseオブジェクトを返す関数ですね。
  -
  -以下のように使うことができ、`JSON.parse` はパースに失敗すると例外を投げるので、
  -それを `catch` することが出来ます。
  +这个函数将接收到的参数传递给 `JSON.parse` ，并返回一个基于`JSON.parse`的promise对象。
  +
  +我们可以像下面那样使用这个Promise函数，由于 `JSON.parse` 会解析失败并抛出一个异常，该异常会被 `catch` 捕获。
   
   [role="executable"]
   [source,javascript]
  
positive.code: });
  ----
  
  ちゃんと `catch` していれば何も問題がないのですが、その処理を忘れてしまうというミスを
  した時にどこでエラーが発生してるのかわからなくなるというヒューマンエラーを助長させる面があります。
  
  [source,javascript]
  .catchによるエラーハンドリングを忘れてしまった場合
  ----
  var string = "jsonではない文字列";
  JSONPromise(string).then(function (object) {
      console.log(object);
  }); // <1>
  ----
  <1> 例外が投げられても何も処理されない
  
  `JSON.parse` のような分かりやすい例の場合はまだ良いですが、
  メソッドをtypoしたことによるSyntax Errorなどはより深刻な問題となりやすいです。
  
  [source,javascript]
  .typoによるエラー
  ----
  var string = "{}";
  JSONPromise(string).then(function (object) {
      conosle.log(object);// <1>
  });
  ----
  <1> conosle というtypoがある
  
  この場合は、`console` を `conosle` とtypoしているため、以下のようなエラーが発生するはずです。
  
  > ReferenceError: conosle is not defined
  
  しかし、Promiseではtry-catchされるため、エラーが握りつぶされてしまうという現象が発生しやすくなります。
  毎回、正しく `catch` の処理を書くことが出来る場合は何も問題ありませんが、
  Promiseの実装によってはこのようなミスが検知しにくくなるケースがあることを知っておくべきでしょう。
  
  このようなエラーの握りつぶしは__unhandled rejection__と言われることがあります。
  Rejectedされた時の処理がないというそのままの意味ですね。
  
  [NOTE]
  ====
  このunhandled rejectionが検知しにくい問題はPromiseの実装に依存します。
  例えば、 https://github.com/yahoo/ypromise[ypromise] はunhandled rejectionがある場合は、その事をコンソールに表示します。
  
  > Promise rejected but no error handlers were registered to it
  
  また、 https://github.com/petkaantonov/bluebird[Bluebird] の場合も、
  明らかに人間のミスにみえるReferenceErrorの場合などはそのままコンソールにエラーを表示してくれます。
  
  > "Possibly unhandled ReferenceError. conosle is not defined
  
  ネイティブのPromiseの場合も同様にこの問題への対処としてGC-based unhandled rejection trackingというものが
  搭載されつつあります。
  
  これはpromiseオブジェクトがガーベッジコレクションによって回収されるときに、
  それがunhandled rejectionであるなら、エラー表示をするという仕組みがベースとなっているようです。
  
  https://twitter.com/domenic/status/461154989856264192[Firefox] や https://code.google.com/p/v8/issues/detail?id=3093[Chrome] のネイティブPromiseでは一部実装されています。
  ====
  
  === doneの実装
  
  Promiseにおける `done` は先程のエラーの握りつぶしを避けるにはどうするかという方法論として、
  そもそもエラーハンドリングをしなければいい という豪快な解決方法を提供するメソッドです。
  
  `done` はPromiseの上に実装することが出来るので、
  `Promise.prototype.done` というPromiseのprototype拡張として実装してみましょう。
  
  [source,javascript]
  [[promise-prototype-done.js]]
  
negative.code: [[promise-done]]
  == 什么是 Promise.prototype.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]
  