次のフルーツをロードする前に1つのフルーツを追加する場合は、コードを現在のように構造化することはできません。これは、のような非同期関数$.getScript()
では、実行が続行される前に完了するまで待機させる方法がないためです。を使用して同期に設定することは可能です$.ajax()
が、それはブラウザにとっては悪いことです(ネットワーク中にブラウザをロックします)ので、お勧めしません。
代わりに、非同期で動作するようにコードを再構築する必要があります。つまり、非同期で繰り返されないため、従来のループfor
や.each()
ループを使用することはできません。
var fruits = ["apples","bananas","oranges","peaches","plums"];
(function() {
var index = 0;
function loadFruit() {
if (index < fruits.length) {
var fruitToLoad = fruits[index];
$.getScript('some/script.js',function(){
// Do stuff
++index;
loadFruit();
});
}
}
loadFruit();
})();
ES7(またはES7コードをトランスパイルする場合)では、次async
のawait
ように使用することもできます。
var fruits = ["apples","bananas","oranges","peaches","plums"];
(async function() {
for (let fruitToLoad of fruits) {
let s = await $.getScript('some/script.js');
// do something with s and with fruitToLoad here
}
})();