0

$.getJSON を使用して while ループを実行し、特定のタスクの進行状況を返そうとしています。最初の $.getJSON は問題なく動作します。ただし、ループは決して完了しません。スクリプト内の変数の理由であるバックエンド php ファイルを介して特定の変数を渡しています。

$.getJSON('http://anyorigin.com/get?url=https://".$domain.".instructure.com/api/v1/courses/".$course_id."/course_copy/".$id."?access_token=".$token."&callback=?', function(data){
    var progress = data.contents.progress;
    alert(progress);
    var elem = document.getElementById('".$id."');
    elem.style.width = progress + '%';
});

var progress_check = 0;
//The part below doesn't work! //
do {
    $.getJSON('http://anyorigin.com/get?url=https://".$domain.".instructure.com/api/v1/courses/".$course_id."/course_copy/".$id."?access_token=".$token."&callback=?', function(data){
        var progress_check = data.contents.progress;
        alert(progress_check);
        var elem = document.getElementById('".$id."');
        elem.style.width = progress_check + '%';
    });
} 
while (progress_check < 100);

スクリプトで特定の div を新しい css スタイルで更新して、読み込みバーを適切に表示する必要があります。ここにdivがあります:

<div id='".$id."-div' class='progress progress-striped active'>
   <div id=".$id." class='bar' style='width: 1%'></div>
</div>

私が間違っていることは確かではありません。前もって感謝します。

4

3 に答える 3

3

あなたvar progress_check = data.contents.progress;はローカル変数で、関数が完了するたびにゼロになります。に変更してprogress_check = data.contents.progress;確認してください。

于 2013-05-16T17:34:20.133 に答える
1

$.getJSON呼び出しは非同期です。結果は、AJAX 呼び出しが完了するまでわかりません。さらに、関数はすぐに戻るため、可能な限り多くの AJAX 呼び出しを並行して起動します。その上、変数はコールバック関数progressで上書きされるため、条件内の同じ名前の変数は更新されません。while

代わりにこれを試してください:

function poll(url) {

    var def = $.Deferred();

    (function loop() {
        $.getJSON(url).done(function(data) {
            var progress = data.contents.progress;
            if (progress < 100) {
                def.notify(progress);
                loop();
            } else {
                def.resolve();
            }
        }).fail(def.reject);
    )();

    return def.promise();
}

ポーリングを「約束」を返す関数に抽象化します。

次にprogress、その promise のイベントを監視し、ループの完了を監視できます。

poll(myUrl).progress(function(percent) {
    var elem = document.getElementById(...);
    elem.style.width = percent + '%';
}).done(function() {
    // this is called when the loop is finished
}).fail(function() {
    // this is called if any of the AJAX calls break the loop
});

pollこれで、進行状況表示ロジックは AJAX コードから完全に分離され、現在の進行状況の値を見つけるためにどの JSON プロパティを参照するかが関数にハードコードされた唯一の依存関係になります。

于 2013-05-16T17:36:54.847 に答える