0

外部ファイルを変更して保存するサーブレットと通信しています。これには時間がかかるため、ある関数のアクションが別の関数のアクションを妨害しないように、JavaScript 関数呼び出しのいくつかを順番に実行する必要があります。

これを行うために、busyflag が false に設定されている場合 (つまり、他の関数呼び出しが同時に処理されない場合) にのみ呼び出すことができる別の関数を取る「順次」関数を作成しました。これは私のコードです:

var busy = false;
function sequential(action) {
    while(busy)
        setTimeout(function(){sequential(action);}, 10);
    busy = true;
    action();
    setTimeout(function(){busy = false;}, 100);
}

function test1() {sequential(function() {alert("test1");});}
function test2() {sequential(function() {alert("test2");});}

これは jsFiddle の例です。何らかの理由で、このコードは 2 番目の呼び出しでループし続けます (関数呼び出しを待機する必要がある場合)。

4

3 に答える 3

1
while(busy)
        setTimeout(function(){sequential(action);}, 10);

setTimeoutブロックせず、すぐに戻り、ループを続行できるようにします。Javascript はシングル スレッドであるため、このループは実行され続け、他のコードの実行を妨げます。つまり、busy が false に設定されてループを終了することはありません。

待機しているものは呼び出しであると仮定するとajax、ある種のキューを使用してから、呼び出しのコールバックでajax次の要求を実行することをお勧めします。

于 2012-05-08T19:40:10.507 に答える
1

あなたのjavascriptがサーバーに対してajax呼び出しを行っていると思います。

異なる呼び出しを次々に実行する必要がある場合は、次の要求を行う前に、1 つの呼び出しから結果が返されるまで待機するフックを設定する JavaScript コードを取得する必要があります。

これらの目的には、jQueryなどの JavaScript ツールキットを使用することをお勧めします。このような問題を解決するのがはるかに簡単になります。jQuery のすべての ajax メソッドは、クエリが完了したときに呼び出される少なくとも 1 つのコールバックを受け入れます。jQuery.ajax ()の場合は、行くことができます

$.ajax(...).done(function() {
   // This part will be run when the request is complete
});

そして.load()の場合:

$("#my_element").load(url,data,function() {
   // This part will be run when the request is complete
});
于 2012-05-08T19:40:40.130 に答える
0

James Montagne によって提案されたようなソリューションを最初に実装しましたが、いくつかの検索の後、XMLHttprequest の onreadystatechange プロパティを使用してビジー フラグを true に設定できることがわかりました。

このコードは期待通りに動作します:

function sequential(action) {
if (busy) setTimeout(function(){sequential(action);}, 20);
else action();
}

function send(message){
    busy = true;
    var request = new XMLHttpRequest();
    request.open("POST", "owlapi", true);
    request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    request.send(message);
    request.onreadystatechange = function() {busy = false;};
}
于 2012-05-09T09:47:38.177 に答える