「最初の方法」は現在のところ*ではありません。jQuery.getScript
は非同期操作のみをサポートしているため、呼び出された直後に戻ります。
スクリプトがmyHelperFunction()
を呼び出そうとしたときにスクリプトがダウンロードされる前に返されるので、myHelperFunction
はundefined
であり、そのエラーが発生します。
*最終的にあなたの希望のスタイルのように動作するコードを書くことができる有望な新しい方法については、この回答の最後にある更新を参照してください。
あなたはこのようなものであるコードで
false
に設定
async
設定で
jQuery.ajax
を使用してそれを行うことができ
:documentation状態として
$.ajax({
url: 'js/myHelperFile.js',
async: false,
dataType: "script",
});
myHelperFunction();
しかし:
同期要求してもよいです一時的にブラウザをロックし、リクエストがアクティブな間にアクションを無効にします。
これは非常に悪いものです。です。 myHelperFile.js
を提供しているサーバーがいつでも応答するのが遅い場合(はになります)、要求が完了するかタイムアウトになるまでページが応答しなくなります。
jQuery全体で頻繁に使用されるコールバックスタイルを採用する方がはるかに良い考えです。
function doStuffWithHelper() {
myHelperFunction();
}
$.getScript('js/myHelperFile.js', doStuffWithHelper);
あなたが呼び出す前に、複数の依存関係をロードする必要がある場合:あなたが名前の関数にコードを置くことができ、いずれかの無名関数を使用する必要はありません
$.getScript('js/myHelperFile.js', function() {
myHelperFunction();
});
myHelperFunction
コードを実行する前に依存関係のすべてがダウンロードされているかどうかを調べるために何らかの種類のシステムをセットアップしない限り、これは機能しません。次に、すべての.getScript
呼び出しでコールバックハンドラを設定して、コードを実行する前にすべての依存関係がロードされていることを確認できます。
ご覧のとおり、このようなアプローチは畳み込まれ、維持不能になります。
複数の依存関係をロードする必要がある場合は、yepnope.jsなどのスクリプトローダーを使用する方がよいでしょう。
yepnope({
load : [ 'js/myHelperFile.js', 'js/anotherHelperFile.js' ],
complete: function() {
var foo;
foo = myHelperFunction();
foo = anotherHelperFunction(foo);
// do something with foo
}
});
Yepnopeはちょうど.getScript
のようにコールバックを使用していますので、あなたがに固執したかったシーケンシャルなスタイルを使用することはできません。これは良いトレードオフですが、複数の同期jQuery.ajax
コールを連続して実行すると、そのメソッドの問題が複雑になるためです。
を更新2013年12月8日
jQuery 1.5 release、それを行うための別の純粋なjQueryの方法を提供します。 1.5の時点で、すべてのAJAX要求がDeferred Objectは、あなたがこれを行うことができます返す:
$.getScript('js/myHelperFile.js').done(function() {
myHelperFunction();
});
は、非同期要求なので、もちろんそれは、コールバックを必要とします。
$.when($.getScript('js/myHelperFile.js'), $.getScript('js/anotherHelperFile.js')).done(function() {
var foo;
foo = myHelperFunction();
foo = anotherHelperFunction(foo);
// do something with foo
});
これは、同時に両方のスクリプトをダウンロードしてのみ、コールバックを実行します:Deferredの作り方を使用すると、しかし、あなたは簡単に独自の複雑な追跡システムなしで、複数の前提条件スクリプトをロードし、これを拡張することができ$.when()を使用して、従来のコールバックシステムの上に巨大な利点を持っていますそれらの両方がダウンロードされた後は、上記のYepnopeの例によく似ています。
アップデート2014年3月30日
私は最近、将来的には、手続きに見える、まだ非同期コードというの種類を可能にする新しいJavaScript機能を知ることができましan articleを読みますあなたは使いたかった! Async Functionsは、await
キーワードを使用して、非同期操作が完了するまでasync
関数の実行を一時停止します。悪いニュースは、2つのECMAScriptバージョン離れたES7に含まれることが現在予定されているということです。
await
は、待機中の非同期機能を使用して、Promiseを返します。真のES6 Promiseオブジェクトが必要な場合や、AJAX呼び出しから返されるjQueryのような約束の実装があれば、ブラウザの実装方法はわかりません。そして、先に進む前にダウンロードしてawait
するためにそれを使用することができます
"use strict";
var getScript = function (url) {
return new Promise(function(resolve, reject) {
jQuery.getScript(url).done(function (script) {
resolve(script);
});
});
};
:
(async function() {
await getScript('js/myHelperFile.js');
myHelperFunction();
}());
あなたがいる場合はES6の約束が必要な場合は、約束を返す関数でjQuery.getScript
をラップする必要があります。実際にこのスタイルで書くことを決定した今日は、asyc
とawait
を使用し、次にTraceurを使用してコードを現在のブラウザで実行されるコードに変換することができます。これを行う利点は、other useful new ES6 featuresも多く使用できることです。
驚くほど包括的な答えです。 – GregL
+!かなり完全な答え。 Howerever、jQueryをロードしたときに 'for..in'シンタックスを使ってなぜ反復していますか? –
@ gion_13これは、内部から 'if(loadedScripts [prop] === false){'を返して関数を終了して、依存関係に依存する次のコードが実行されないようにします。 '$ .each'を使用した場合は、' return false'でループを早く停止させることができましたが、ループの後のコードを実行すると、ループの前に何らかのフラグを設定してループの後でチェックしなければなりませんそのコードが実行されないようにします。 'for..in'ループを使用して関数を終了すると、よりきれいです。それを今見て、辞書の代わりに私はちょうどカウントvarを使用し、代わりに全体のスクリプトと比較したでしょう。 –