0

Almond.js と Require.js オプティマイザーを使用して、Require.js なしで使用できるスタンドアロン ファイルを作成しようとしています。ファイルを正常にコンパイルでき、すべてのコードが実行されましたが、コードが間違った順序で実行されるという問題が 1 つあります。

私のメインファイル(include=オプティマイザに渡されたオプションにあるファイル)に次のものがあるとしましょう:

console.log('outside');
require(['someFile'], function(someModule) {
    console.log('inside');
    window.foo = someModule.rightValue;
});

そして、私が持っているHTMLに出ます:

<script src="myCompiledFile.js"></script>
<script>
    console.log('out in the HTML');
</script>

私は almond.js とコンパイルされたファイルを使用しているため (したがって、ファイルの読み込みは行われていません)、出力が得られると予想されます。

outside
inside
out in the HTML

ただし、実際に見ているのは次のとおりであるため、まだ非同期性が発生していることがわかりました。

outside
out in the HTML
inside

window.fooHTMLからチェックしようとすると、そこにはありません。

scriptそれで、私の質問は、次のブロックに物事を渡す前にすべてのコードを最初に実行する、通常の/同期JSファイルのようにコードを取得するにはどうすればよいですか? ユーザーに「すべてのコードをwindow.setTimeoutにラップする」と正確に伝えることはできません。

4

1 に答える 1

2

デフォルトでは、Almond は RequireJS のrequire呼び出しのタイミング セマンティクスを複製します。requireRequireJS では非同期なので、Almond でも非同期です。これはソースですぐに確認できます。Almond はモジュールをすぐに実行できるsetTimeout場合でも、モジュールの実行をスケジュールするためにa を使用します。一般的なケースでは、開発者は、非同期で動作するように作成したコードが、Almond を使用しているという理由だけで突然同期になるとは考えていないため、理にかなっています。すべてのプロジェクトで問題になるわけではありませんが、UI (たとえば) を特定の順序で更新する必要があるプロジェクトでは、タイミング セマンティクスを変更するとコードが壊れる可能性があります。

2 つのオプション:

  • 状態の直前のコメントのようにsetTimeout、usingは Almond でグローバルrequire('id')に機能します。これは、バンドルが読み込まれると、すべてが読み込まれたことが保証されるためです (Almond は動的に読み込まれないため)。

  • require引数を追加して呼び出す方法もあります。4 番目の引数が true の場合、呼び出しは同期になります。

    require(['someFile'], function(someModule) {
        console.log('inside');
        window.foo = someModule.rightValue;
    }, undefined, true);
    

これは Almond のコードを読むことで確認できます。私が見つけることができるドキュメントはありませんforceSync(問題のパラメーターの名前です) が、いくつかのバグ レポートで言及されており、プライベートな機能を意図しているというコメントは見当たりませんでした。

于 2014-03-05T11:12:45.713 に答える