2016-12-08 6 views
2

.aspx私はサードパーティ製のJavaScriptエディタを使用しています。CodeMirrorです。タブを切り替えると、エディタのタブを離れて元に戻ります。エディタの内容は更新されません。これはCodeMirrorの既知の問題であり、人々はそれを処理するために専用のRefresh関数を使用します。私の解決方法では、ブートストラップタブスイッチングノックアウトのデータバインド中に呼び出します。問題は、それはそれ自身では機能しないので、人々が何をしているかは、「遅延」を追加することです:0秒遅れでsetTimeoutが結果を完全に変更 - なぜですか?

setTimeout(function() { 
    editor.refresh(); 
}, 1); 

...それが動作します。 私はそれに0msの遅延を与えることができ、それはまだを動作させるので、1msは問題ではありません。 setTimeout関数を削除すると、突然CodeMirrorがリフレッシュされません(アプリケーションの現在の状態に対応するためにリフレッシュする可能性があります)。

遅延が0 msと宣言されているとします。

1)実際には何が起こっていますか? AM私は、ブラウザがsetTimeout関数を手にして、実行キューから取り出して、の可能なウィンドウが少なくとも 0msの間待つことを理解しています。実際には、これにより遅延が生じます。そうですか?それともこの作品を作っている何か他にありますか?

2)理論上、動作しない可能性がありますか?私は、いくつかの環境では遅延が小さすぎてこれが機能しないことを理解しています。また、実際にASP.NET /ノックアウトのシナリオでは、遅延が導入されていない可能性がありますか?

3)何らかの形で計算または差し引くことができる決定的な最小遅延はありますか?遅延が少なくともX msになると確信できますか?

一般的に言えば、私はそれほど決定的ではないように思われる解決策をコミットすることはできません。現時点では、「ある/何か」の遅延が導入されているため、動作しているように見えます。誰もこれについてもっと光を当てることができますか?

+1

、 'setTimeout'は、かかわらず、中断スレッドが実行され、リソースが解放され、再描画が完了するようになります。したがって、時間そのものは、望ましいリフレッシュ効果を得るために重要ではない。正確なタイミングが必要な場合は、この説明が役に立つでしょう。http:// ejohn。org/blog/how-javascript-timers-work/ – Nope

答えて

0

ブラウザでは、JavaScriptをUIで1つのスレッドで実行しています。非同期がJavaScriptでどのように機能するのか理解しておく必要があります。 setTimeoutには、非同期コールバック機能があります。 setTimeoutは、関数がキューにスローされ、現在スタックにあるすべてのコマンドが実行されたときにのみ呼び出されます。コンソールで

setTimeout(function() { 
    console.log('setTimeout'); 
}, 0); 
for(let i = 0; i<=2; i++){ 
    console.log('loop'); 
} 

表示:たとえば

時間が設定されているどのくらいのために私の知る限りでは

work 
work 
work 
setTimeout 

enter image description here

+1

JavaScriptはシングルスレッドのブラウザで、UIコードを1つのスレッドで実行します。 JS_can_は複数のスレッドで実行されますが、一般的にはほとんどの場合そうですが、そうではありません。 – vlaz

+0

@vlazありがとう、私のコメントを更新しました –

+0

@vlazはい、それは多くのスレッドと多くのコンピュータで実行できますが、別のコンテキストで実行する必要があります。ほとんどの場合、たいていの場合、ほとんどのブラウザのJavaScriptは、各タブとブラウザウィンドウ、拡張機能、ワーカーなど、少なくとも1つのスレッドで実行されています。 – Blindman67

関連する問題