2017-10-02 24 views
0

私はプロミスに約resolveを混同しています。異なる解決が呼び出されたとき約束を約束して実行する

resolveは、innerResolveの前に呼び出されますが、クロムコンソールでは[Promise then execute]の前に '内部のPromise then execute'が記録されるのはなぜですか。

私はそれがあるかもしれないと思う:

約束の状態がちょうど成就に状態を設定し、thenメソッドが呼び出されたときに、ジョブがjobQueueにキューイングされますresolveを呼び出して、保留された場合。 innerPromise.thenが最初に呼び出されるため、ジョブは最初にキューに入れられます。

この質問には規範的な説明がありますか?ここで

は私のコードです:これが完了すると、彼らは

単一のスタックフレームに
resolve() 
console.log("resove is called") 
innerResolve() 
console.log("innerResolve is called") 

あるので、約束が解決されている場合

console.log("main start") 
new Promise(resolve =>{ 
    new Promise(innerResolve =>{ 
    resolve() 
    console.log("resove is called") 
    innerResolve() 
    console.log("innerResolve is called") 
    }).then(() => { 
    console.log('inner Promise then execute') 
    }) 
}).then(() => { 
    console.log('Promise then execute'); 
}) 
console.log("main end") 
+0

を両方お使いの約束が、すぐにそれらが作成されるように解決されています。その時点で、はい、 '.then()'が呼び出される順番です。関連するスペックの概要については、https://stackoverflow.com/questions/46408228/es6-promise-execution-order-for-returned-values/46409443#46409443を参照してください。 – Ryan

答えて

0

ボットの解決には、イベントループをチェックし、呼び出されます両方とも完了しているので、完了した約束をすべて実行する。コンパイラによっては、それらのいずれかを呼び出すことがあります。 innerResolve次いで、後に実行されたので、次の例

console.log("main start") 
 
new Promise(resolve =>{ 
 
    new Promise(innerResolve =>{ 
 
    resolve() 
 
    console.log("resove is called") 
 
    setTimeout(innerResolve, 1000); 
 
    console.log("innerResolve is called") 
 
    }).then(() => { 
 
    console.log('inner Promise then execute') 
 
    }) 
 
}).then(() => { 
 
    console.log('Promise then execute'); 
 
}) 
 
console.log("main end")

を試みる()をthenメソッドを呼び出さない後

resolve()
1

と呼ばれていました。 resolve()の呼び出しは、thenメソッドが次のティック後に呼び出されるようにキューイングするため、内側のプロミスリゾルバは、内部のthenメソッドの直前に実行され、次に外側のthenメソッドが次のティックでその順序で呼び出されます外側の約束が連鎖される前に内側の約束が外側の約束の中で同期して連鎖されているからです。

私はthenメソッドの順序は、あなたが期待していたよりも異なっている理由を理解しやすくするために、2つの以上のログを追加しました:

console.log("main start") 
 
new Promise(resolve =>{ 
 
    console.log("outer resolver execute") 
 
    new Promise(innerResolve =>{ 
 
    resolve() 
 
    console.log("resove is called") 
 
    innerResolve() 
 
    console.log("innerResolve is called") 
 
    }).then(() => { 
 
    console.log("inner Promise then execute") 
 
    }) 
 
    console.log("inner promise chained") 
 
}).then(() => { 
 
    console.log("Promise then execute"); 
 
}) 
 
console.log("main end")

関連する問題