7

AMD (非同期モジュール定義) で 'require' は同期ですか? もしそうなら、何がこの仕様を非同期にするのですか? コードの途中に require() がある場合 (まだロードされていない場合)、実行が停止しますか? ブラウザ側で話します。

4

2 に答える 2

3

ここには 2 つの異なるsynchronous概念があります。1 つ目は、「Web ページ全体を停止し、ファイルを待つか」です。

答えはノーだ。依存関係のあるスクリプトがある場合、RequireJS はそれを行いません。

適切に使用すると、promise システムが使用されます。つまり、コールバックを送信してそのファイルの要件を定義すると、必要なファイルがすべて読み込まれるまでコールバックは実行されません。

これらの必要なファイルのいずれかの内部に require がある場合、その依存関係が読み込まれるまで、そのコールバックは実行されません。

最も外側のコールバック (通常、スクリプトの一番下にあるもの) は、内部のすべてが完了するまで実行されません。

これは約束システムで動作します。promise システムがどのように機能するかを理解することは価値があります (ある意味でオブザーバー パターンに似ています)。それらは、複数の人が任意の順序で聞くのではなく、イベントに基づいて渡されたり連鎖したりすることを意図しています.

var widget = new Widget(),  
    widgetLoaded = widget.load(url); // return a promise to let the program use the widget

widgetLoaded.then(function () { widget.move(35); })
            .then(function () { widget.setColour("Blue"); })
            .then(function () { widget.show(); });

これは、呼び出しが完了thisするまで実際には発生しないことを除いて、関数呼び出しをチェーンできるように戻るようなものです。widget.load()

widget、ウィジェットがロードされてすべてが正常である場合は約束を守るか、何か問題が発生した場合は約束を破ることによって、これがいつ発生するかを実際に制御します。

ほとんどの promise システム、.thenまたは彼らがそれを呼び出すものは何でも、2 つの関数 (kept と壊れた - 私のシステムでは壊れたものは常にオプションです) を取るか、and でオブジェクトを取りますsuccess-failureこれ$.ajaxを行い、次に何を事前に決定できるようにしますデータがロードされたとき、または失敗した場合にデータを処理したい - 約束します。

したがって、ページは引き続き 100% 非同期で (UI を中断することなく) 動作しますが、すべてのモジュールが正しい順序で起動するという点で 100% 同期的です。

覚えておかなければならないことの 1 つは、コードにこれらの依存関係がある場合、スクリプトの下部に依存関係を置いて、実行を待機し、インラインにすることはできません。それらはすべて、コールバック内でロックするか、コールバックによって呼び出されるのを待っている関数内でロックする必要があります。

これは単純に、実際の処理に関して非同期プロセスであり、ブラウザによるイベント/JS の実行、ページのレンダリングなどをブロックしないためです。

于 2012-09-29T17:49:05.423 に答える
2

requireJSの場合:

必要なモジュールと一緒にコールバックメソッドを に渡す必要があります.require()。これは、リソースが正常にロードされたときに起動されます。したがって、もちろん、そのコールバック内でロードされた AMD または CommonJS モジュールにのみアクセスする必要があります。

NodeJS の場合:

はい、.require()同期的に動作します。NodeJS は、AMD ではなく、CommonJS モジュール システムを使用します。

于 2012-09-29T16:57:49.363 に答える