anchor.diff:  include::embed/embed-mixed-onready.js[]
   ----
   
  -<<mixed-onready.js>>ではDOMが読み込み済みかどうかで、
  -コールバック関数が同期的か非同期的に呼び出されるのかが異なっています。
  +<<mixed-onready.js>>会根据执行时的DOM是否装载完毕来决定是对回调函数进行同步或者是异步的调用。
   
  -onReadyを呼ぶ前にDOMが読み込みが完了している::
  -    同期的にコールバック関数が呼ばれる
  -onReadyを呼ぶ前にDOMが読み込みが完了していない::
  -    `DOMContentLoaded` のイベントハンドラとしてコールバック関数を設定する
  +如果在调用onReady之前DOM已经载入的话::
  +    对回调函数进行同步调用
  +如果在调用onReady之前DOM还没有载入的话::
  +    通过注册 `DOMContentLoaded` 事件监听器来对回调函数进行异步调用
   
  -そのため、このコードは配置する場所によって、
  -コンソールに出てくるメッセージの順番が変わってしまいます。
  +因此，如果这段代码在源文件中出现的位置不同，在控制台上打印的log消息顺序也会不同。
   
  -この問題の対処法として常に非同期で呼び出すように統一することです。
  +为了解决这个问题，我们可以选择统一使用异步调用方法。
   
   [role="executable"]
   [source,javascript]
  
positive.code: 42
  ----
  
  JavaScriptは上から実行されていくため、まず最初に `<1>` が実行されますね。
  そして次に `resolve(42);` が実行され、この `promise` オブジェクトはこの時点で `42` という値にFulFilledされます。
  
  次に、`promise.then` で `<3>` のコールバック関数を登録しますが、ここがこのコラムの焦点です。
  
  `promise.then` を行う時点でpromiseオブジェクトの状態が決まっているため、
  プログラム的には同期的にコールバック関数に `42` を渡して呼び出す事はできますね。
  
  しかし、Promiseでは `promise.then` で登録する段階でpromiseの状態が決まっていても、
  そこで登録したコールバック関数は非同期で呼び出される仕様になっています。
  
  そのため、`<2>` が先に呼び出されて、最後に `<3>` のコールバック関数が呼ばれています。
  
  何故、同期的に呼び出せるのにわざわざ非同期的に呼び出しているでしょうか?
  
  === 同期と非同期の混在の問題
  
  これはPromise以外でも適応できるため、もう少し一般的な問題として考えみましょう。
  
  この問題はコールバック関数を受け取る関数が、
  状況によって同期処理になるのか非同期処理になるのかが変わってしまう問題と同じです。
  
  次のような、コールバック関数を受け取り処理する `onReady(fn)` を見てみましょう。
  
  
  [role="executable"]
  
negative.code: include::embed/embed-async-onready.js[]
  ----
  
  关于这个问题，在 http://effectivejs.com/[Effective JavaScript] 的 **第67项 不要对异步回调函数进行同步调用** 中也有详细介绍。
  
  [quote, David Herman, Effective JavaScript]
  ____
  - 绝对不能对异步回调函数（即使在数据已经就绪）进行同步调用。
  - 如果对异步回调函数进行同步调用的话，处理顺序可能会与预期不符，可能带来意料之外的后果。
  - 对异步回调函数进行同步调用，还可能导致栈溢出或异常处理错乱等问题。
  - 如果想在将来某时刻调用异步回调函数的话，可以使用 `setTimeout` 等异步API。
  ____
  
  前面我们看到的 `promise.then` 也属于此类，为了不编码上述的同步异步调用可能引起的混乱，Promise在规范上规定 **Promise只能使用异步调用方式** 。
  
  最后，将上面的 `onReady` 函数用Promise重写的话，代码如下面所示。
  
  [role="executable"]
  [source,javascript]
  