9

JavaScript はシングル スレッド言語であるため、一度に 1 つのコマンドを実行します。非同期プログラミングは、ブラウザーによって管理されるWeb API (イベント処理用の DOM、AJAX 呼び出し用の XMLHttpRequest、setTimeout 用の WindowTimers ) およびイベント キューを介して実装されています。ここまでは順調ですね!次の非常に単純なコードを考えてみましょう。

$('#mybox').hide(17000);
console.log('Previous command has not yet terminated!');
... 

誰かが上記の根底にあるメカニズムを私に説明してもらえますか? .hide() はまだ終了しておらず (アニメーションは 17 秒続きます)、JS エンジンはそれを処理しており、一度に 1 つのコマンドを実行できるため、次の行に移動して、残りのコード?

あなたの答えがアニメーションがプロミスを作成するというものである場合、質問は同じままです: JavaScript が同時に複数のことを処理する方法 (アニメーション自体を実行し、プロミスの場合はアニメーション キューを監視し、それに続くコードを続行します。 ..)。

さらに、コードの実行と同時に残りのコードが実行されることを意味する解決または拒否されるまで、親の Deferred オブジェクト を監視する必要がある場合、jQuery のプロミスがどのように機能するかを説明できません。シングルスレッドのアプローチでそれはどのように可能ですか? AJAX呼び出しを理解するのに問題はありません.JSエンジンから取り除かれていることを知っています...

4

4 に答える 4

2

JavaScriptには、ブロッキングとノンブロッキングといういくつかの種類の関数があります。

非ブロッキング関数はすぐに戻り、バックグラウンドでコールバック関数の呼び出しを待機している間、イベントループは実行を続けます (Ajax の約束のように)。

アニメーションは setInterval や setTimeout に依存しており、これら 2 つのメソッドはすぐに戻り、コードを再開できるようにします。コールバックはイベント ループ スタックにプッシュ バックされて実行され、メイン ループが続行されます。

これが役立つことを願っています。

詳細について は、こちらまたはこちらをご覧ください

于 2016-02-15T13:06:56.493 に答える