2016-09-29 11 views
0

私はES6約束を理解しようとしています。私のECMA 6の約束が同期の方法で解決されない

var function1 = function() { 
    console.log("function 1 has started") 
} 

var function2 = new Promise((resolve, reject) => { 
    console.log("function2 has started"); 
    setTimeout(function() { 
     console.log("function2 has ended") 
     resolve(); 
    }, 3000) 
}) 

var function3 = new Promise((resolve, reject) => { 
    console.log("function3 has started"); 
    setTimeout(function() { 
     console.log("function 3 has ended") 
     resolve() 
    },2000) 
}) 

var myFunc = function() { 
    function3.then(function2).then(function1()) 
} 

myFunc(); 

私は期待出力::私は、このコードの実行を取得しようとしました

function3 has started 
//after 2 seconds 
function3 has ended 
function2 has started 
//after 3 seconds 
function2 has ended 
function1 has started 

出力私が取得:

function2 has started 
function3 has started 
function1 has started 
//after 2 seconds 
function3 has ended 
//1 second more 
function2 has ended 

あなたは私が私のコードで間違っていたものを私に説明してもらえ?心に留めておくべき

答えて

2

2つのこと:

  • 約束のコンストラクタを呼び出すと、渡されたコールバック関数が常にコンストラクタの内部からすぐに呼び出されます。
  • then()またはcatch()に渡すコールバックは、すぐには呼び出されません。

したがって、あなたのシナリオでは、文字列「関数2が開始されました」と「関数3が開始された」二約束が construcutedされているようを印刷しています。

「ファンクション1が起動しました」は、myFunc()内から直接呼び出すため、直後に出力されます。おそらく、このようにカッコなしではfunction1 を渡すためのもの:その場合は

function3.then(function2).then(function1) 

両方の約束は成就したら、関数1は(あなたが期待通りに)最後に呼び出されます。

私は残りの2つの出力のシーケンスが明確だと思います。setTimeoutコールバックが呼び出されると、「終了」メッセージが表示されます。

以下は、期待していた出力を生成します。

var function1 = function() { 
    console.log("function 1 has started") 
} 

var function2 = function() { 
    return new Promise((resolve, reject) => { 
     console.log("function2 has started"); 
     setTimeout(function() { 
      console.log("function2 has ended") 
      resolve(); 
     }, 3000); 
    }); 
}; 

var function3 = function() { 
    return new Promise((resolve, reject) => { 
     console.log("function3 has started"); 
     setTimeout(function() { 
      console.log("function 3 has ended") 
      resolve() 
     }, 2000); 
    }); 
}; 

var myFunc = function() { 
    function3().then(function2).then(function1); 
} 

myFunc(); 
+0

ありがとうございます。これは明らかです。私が期待している出力を得るためにコードをどのようにリファクタリングすればよいですか? ( – Pechou

+0

期待された出力を生成するコードのバージョンを追加しました。第2の約束は、最初のものが成立した(タイマーが順番に実行される)両方の約束が最初に構築された(タイマーが並行して実行される) – Jens

+0

乾杯!多くの感謝を助ける、私はポイントを得た! – Pechou

関連する問題