2016-05-05 8 views
3

私は期待どおり1 2 3の代わりに2 1 3を次のように印刷するのはなぜですか?ES2015 Promiseチェーン - なぜpromisified関数はすぐに実行されますか?

(function() { 
 
    return new Promise(function(resolve) { 
 
    document.write('2'); 
 
    resolve(); 
 
    }) 
 
    .then(log('1')); // I was expecting this `log` function invocation to run first 
 
}()); 
 

 
function log(message) { 
 
    document.write(message); 
 

 
    return function() { 
 
    document.write('3'); 
 
    } 
 
}

私はクローム49.0.2623.112 mを使用しています。

+0

executor関数が最初に実行されます。表示されている結果は、コードごとに正しいです。 –

+0

なぜ '2 1 3'が正しくないと思いますか? – ach

答えて

4

MDNから:

エグゼキュータ機能が解決を提供し、(プロミスコンストラクタも作成されたオブジェクトを返す前に、エグゼキュータが呼ばれる)機能を拒否プロミス実装によって直ちに実行されます。

あなたの最初の無名関数が実行され、その中new Promise()コールの実行、およびない最初の事はあなたのexecutor機能(コンストラクタへのコールバック)を実行しています。 そのはすぐにdocument.write(2)を呼び出します。最初に表示されるのは2です。

編集 —あなたの質問には明確な説明がありますが、簡単なJavaScriptの呼び出し順序になっています。それは式の残りの部分に作業を開始する前に

return new C(fn).then(expr); 

JavaScriptがnew C(fn)コールを完了:あなたの約束-構築機能は、次の形式を持っているだけでreturn文が含まれています。 newが返されると(その時点で2が既に印刷されます)、式の.then(expr)部分が評価されます。これは、.then()の引数リストでコールを介して1の印刷をトリガします。

.オペレータの左側を完全に評価する必要があります。そうしないと、「then」プロパティを検索する場所がないためです。

関連する問題