1

ここでいくつかの間隔に問題があります。

基本的な概念は、バックエンドスクリプトから情報が供給される、行ごとに1つのプログレスバー機能があることです。このスクリプトを、ajax呼び出しの間隔内で5秒ごとにpingします。

これは機能しますが、倍数に問題があります(つまり、2番目のプログレスバーが同じ関数を呼び出す)、またはアイテムが「閉じている」(divスライド)と停止する必要があります。これは非常に複雑なコードなので、必要な部分を引き出すために最善を尽くしますが、現状では実行されない可能性があることに注意してください。

完全なウォークしかし-関数名は無実を保護するために変更されました:)

onlcick、divが開き、この開始関数が呼び出されます。

function start(ID){
var request = $.ajax({  
    url: "script?DO=Start&ID="+ID
    ,  type: "GET"              
    ,  cache: false
    ,  dataType: "text"
});
request.done(function(msg) {
    startLoop(ID);      

});
request.fail(function(jqXHR, textStatus) {
    //alert("Request failed: " + textStatus );      
});
}

ご覧のとおり、これによりstartLoop fncが呼び出され、情報の更新情報スクリプト(getInfo())にpingが送信され続けます。

function startLoop(ID){
var i = setInterval(function(){
    var xstatus = getInfo(ID);
    //other stufff that works       
    if(xstatus=="done"){
        clearInterval(i);
    }

}, 5000);
}

これは、それ自体で正常に機能します。

2番目のクリックイベントが2番目のウィンドウを開く場合、それは単に新しいIDを持ち、同じ関数を呼び出します。

したがって、私には1つのi間隔があり、1つを破壊するとすべてが停止するようです。iをi.IDのようなオブジェクトに変換する必要がありますか?

また、停止するとonclick = stop()が呼び出され、ループの外側からは停止できないようです。

これを機能させるためにどのように再配置しますか?

1つまたは複数の同時アイテムの開始、停止、および自動更新をサポートする必要があります。

4

1 に答える 1

1

setTimeoutの代わりに を使用しない理由はclearInterval、既にそのコールバック内で間隔を強制終了する責任を負っているからです。

// using this approach might require changing the name of this function
function startLoop(ID) { 
   setTimeout(function(){
        var xstatus = getInfo(ID);

        //other stufff that works       
        if(xstatus!=="done"){
            startLoop(ID); // do it all over again if it's not complete
        }

    }, 5000);
}

これにより、同じ動作が得られますが、いくつかのボーナスが追加されます。1 つには、これにより、1 つのジョブが完了したときに他のジョブが強制終了されることはありません。もう 1 つは、これは非同期で実行されるため、リクエストが完了するまでに 5 秒以上かかり始めた場合、5 秒ごとにやみくもに発火するのとは対照的に、タイムアウトは返された後 5 秒間再度 ping を送信しません。リクエストが完了しました。

于 2013-02-20T19:17:48.477 に答える