2017-04-23 8 views
0

約束が解決された後、私たちはそれに対して.thenメソッドを使うことができます。いつ実行されますか?解決されるとすぐに実行されますか?例えば、次の例では、Javascriptが来るとすぐに約束が「準備完了」になります。何も大きな出来事はありません。約束事の中で大きな計算は行われないので、.thenメソッドは他のすべての後に実行されるのはなぜですか?おかげJavascript - 約束の結果はいつ利用可能になりますか?

let $body = $('#mainBlock'); 
let checker = true; 

let testPromise = new Promise(
    function(resolve, reject) 
    { 
     if(checker) 
     { 
      resolve(); 
      $body.append('<p>CodeHasFinished</p>'); 
     } 
    } 
); 




$body.append('<p>before</p>'); 

testPromise.then(function(){ 
    $body.append('<p>middle</p>'); 
}); 

$body.append('<p>after</p>'); 

/* 

Result added to body-> 
CodeHasFinished 
before 
after 
middle 

*/ 
+0

'()'同期 – guest271314

+0

私は{.then}すべての後に実行されることを前提とすべき結果を返すことが保証されていません.thenそれ以外は?ありがとう –

+1

ここでは何も "仮定"しないでください。 'Promise'チェーンを使いたい場合は' .then() 'と' .catch() 'を連鎖し、' .then() 'と' .catch() 'に渡される関数内でタスクを実行します。同期コードを使用する場合は、同期コードを使用します。なぜ非同期コードと同期コードを同期しようとしていますか?あなたは何を達成しようとしていますか? – guest271314

答えて

2

Promises/A+ spec

2.2.4によります。 onFulfilledまたはonRejectedは、実行コンテキストスタックにプラットフォームコードのみが含まれるまで呼び出すことはできません。 [3.1]

注ここでは3.1状態

「プラットフォームのコードは」エンジン、環境、そして約束の実装コードを意味しています。実際には、この要件はonFulfilledとは、そのあなたのコメント意味で、だから、

....非同期、その後、呼び出されるイベントループのターンの後、新鮮なスタックを実行onRejectedことを保証します。その後、良い仮定

は、次のコード

let i = 0; 
 
console.log('a', ++i); 
 
Promise.resolve().then(() => console.log('e', ++i)).then(() => console.log('h', ++i)).then(() => console.log('j', ++i)); 
 
console.log('b', ++i); 
 
Promise.resolve().then(() => console.log('f', ++i)).then(() => console.log('i', ++i)); 
 
console.log('c', ++i); 
 
Promise.resolve().then(() => console.log('g', ++i)); 
 
console.log('d', ++i);

を検討される "他のすべての後に" 実行されます

私はそれらのいずれかの場合には、明確にするために...

  • J 10
  • コンソール出力が

    • B 2
    • になることを確認することができます.then関数内に非同期コードが含まれていた場合(Promiseが返された場合)、ではなくは予測が簡単です。 R「仮定」 - .thenことは、他のすべて後に実行されますが - 実際には非常に合理的な1

    関連する問題