2016-03-25 21 views
0

は、単純な角度のコントローラ内部に、このコードを、与えられた:予期しない結果

var s = $timeout(function() { 
    console.log(s); 
}, 2000); 

console.log(s); 

$timeout(function() { 
    $timeout.cancel(s); 
}, 1000); 

だから我々は2秒で発生するはずの変数sでタイムアウトを作成しています。それに1秒でタイムアウトがキャンセルされるので、決して発生しません。キャンセルする前に、コンソールにsと記録します。ステータスコードが1であり、その値が未定義であることが予想されます。その代わりに、そのステータスは2であり、その値は「キャンセル」されています。どういうわけか、システムはタイムアウトをキャンセルする予定であることを事前に知っており、それに応じて調整します。

これはどうですか?私はオブジェクトsの状態がの後に$timeout.cancel(s);の後になると期待します。私は確かに前にそれを期待していない。何が起きてる?

Here's the console after this code runs

+0

に設定参照してください。あなたが正しいです。 'console.log(s。$$ state.status);'は0を示し、オブジェクト全体を記録すると状態は2になります。 –

+1

可能な重複:http://stackoverflow.com/q/11214430/398606、http: //stackoverflow.com/q/4057440/398606 ...私はそれが良い説明ではなかったので、私のコメントを削除しました。しかし、うまくいけば、これらの質問は役に立ちます:) –

+0

確かにその質問に関連していますが、その人の問題はもはや現代のブラウザには存在せず、私はスピード/パフォーマンスの面で技術的制限と見なします。(2)尋ねたことは機能の制限ではなく、制限ではありません(Chromeのデベロッパーチームは、望むならば継続的なバインディングを無効にすることができます)。しかし、ありがとう! –

答えて

0

これは、システムが何が起きるかを事前に「知っている」という事実とは関係がありません。

代わりに、Chromeコンソールに記録されたオブジェクトを展開するまで、Chromeは更新されたときにそのオブジェクトのすべてのプロパティを更新し続けます。 しかし、オブジェクトを開いていれば、即時プロパティの値は固定されています。しかし、あなたは孫の財産を凍結していません。

上記のコードを更新して、タイムアウトを上げるようにしました。

var s = $timeout(function() { 
    console.log(s); 
}, 20000); 

console.log(s); 

$timeout(function() { 
    $timeout.cancel(s); 
}, 10000); 

私は10秒未満でPromise$$state両方開いて切り替える場合、私は下のスクリーンショットを参照してください。私は10秒未満でPromiseなく$$stateを開くと、私の代わりに、そのステータスが@SunilDうわー2.

enter image description here

2

常に

console.log(JSON.stringify(obj)); 

または出力オブジェクトのスナップショットではなく、その基準に他の手段によってでオブジェクトをシリアル化します。

+0

ありがとう!私はより多くの実験の後で自分の長い答えを加えました。私は今日何かを学んだ! –

関連する問題