2016-08-11 8 views
0

が私のデモコードです時間を実行します。

doGet('../loaderDemo/1.lst'); 
doGet('../loaderDemo/2.lst'); 
doGet('../loaderDemo/3.lst'); 
doGet('../loaderDemo/4.lst'); 
doGet('../loaderDemo/5.lst'); 

function doGet(filename) { 
    $.get(filename,function (data) { 
     console.log(data + filename); 
    }); 
} 

ライン "はconsole.logは(...)" のdoGet(の順序として実行されない場合があります)、出力内容はであり、ではなく、1番目→2番目→3番目→4番目→5番目の順である。

実際、出力順序は各実行でランダムです。

どうすれば順番に出力できますか?

-------------更新:-)あなたの助けを

おかげ-------------------

".lst"ファイルは読み込みたい3Dモデルです。アニメーションを適切にレンダリングできるように、モデルをロードするだけです。この場合、どのソリューションが最適ですか?

各 ".lst"ファイルには、1つのフレームの情報が含まれています。このデモでは、 "console.log()"の出力は1.lst - > 2.lst - > 3.lst - > 4.lst - > 5.lstの順でなければなりません。フレームアニメーション。

+1

$あなたは非同期を強制的に再帰関数を使用することができ、非同期 –

+0

あるに.get同期的に実行する呼び出し。 –

+0

@JaromandaX - 解決策は何でしょうか? – Rayon

答えて

1

を意味する

ので

doGet('../loaderDemo/1.lst') 
.then(function() { 
    doGet('../loaderDemo/2.lst'); 
}) 
.then(function() { 
    doGet('../loaderDemo/3.lst'); 
}) 
.then(function() { 
    doGet('../loaderDemo/4.lst'); 
}) 
.then(function() { 
    doGet('../loaderDemo/5.lst'); 
}); 

function doGet(filename) { 
    // added return 
    return $.get(filename,function (data) { 
     console.log(data + filename); 
    }); 
} 

を次のように、最小限の書き換えで、あなたが行うことができますダウンロード完了のため、しかし、もし重要ではありませんが、処理の順序は - jQuery.whenを使用して、すべてのダウンロードが完了するまで「待機」し、必要な順番で結果を処理します。

$.when(doGet('../loaderDemo/1.lst'), 
    doGet('../loaderDemo/2.lst'), 
    doGet('../loaderDemo/3.lst'), 
    doGet('../loaderDemo/4.lst'), 
    doGet('../loaderDemo/5.lst') 
) 
.done(function(v1, v2, v3, v4, v5) { 
    [].forEach.call(arguments, function(arg) {} 
     console.log(arg.data, arg.filename); 
    }) 
}); 

function doGet(filename) { 
    return $.get(filename) 
    .then(function(data) { 
     // need this so we can access the filename and the data for each result 
     return { 
      data: data, 
      filename: filename 
     }; 
    }); 
} 
+1

しかし、このアプローチを使用すると、次のリクエストの 'get-call'を遅らせています...並行してリクエストを作成し、 – Rayon

+0

はい、それは本当です - 彼が修正したい問題に依存します - 別の解決策を追加しましょう –

+0

ありがとう、私の問題を本当に解決しました! –

-1

$.get()は、あなたが上記

がそれにasync:falseを追加実行する関数を記述することによって、それを達成することができます

$.ajax({ 
    url: url, 
    data: data, 
    success: success, 
    dataType: dataType 
}); 

の省略形です。それが最も実現可能な解決策ではないことを忘れないでください。 AJAXは(種類の)約束を返し$.get jQueryの非同期操作のために

+0

のgetの結果を処理したいです。 –

+0

@JaromandaX Ajaxと一緒に行く方法ではないと言いましたか? –

+1

この場合、あなたは全く質問に答えていません –

0

非同期プログラミングの世界へようこそ。これを処理する最善の方法は、同時に5つの非同期関数をすべて呼び出すことですが、コンソールログステートメントの実行が完了するまで実行を延期してから、順番に実行します。

(これは、もちろん、それは同じ順序ですべての時間をそれらを実行することが本当に重要だと仮定している。最初に完了したかは重要ではありませんように、より良い解決策は、あなたのコードをリファクタリングされる可能性があります)

問題の例を以下に示します。

ほとんどの場合、これは、5つのコールを1つずつコールするのではなく、同時に5つのコールを実行するため、ほとんどの場合、ポストされたシーケンシャルソリューションよりも高速です。

return $.when(
    doGet('../loaderDemo/1.lst'), 
    doGet('../loaderDemo/2.lst'), 
    doGet('../loaderDemo/3.lst'), 
    doGet('../loaderDemo/4.lst'), 
    doGet('../loaderDemo/5.lst'), 
).done(function(res1, res2, res3, res4, res5) { 
    console.log(res1), 
    console.log(res2), 
    console.log(res3), 
    console.log(res4), 
    console.log(res5), 
}); 

(私の前の編集は$ qを使用しますが、それはjqueryのは、ほぼ同じ働き内蔵のものを持っていることが判明)

+0

それは分かりませんでした。 – Erik

関連する問題