1

私の仕事は、長時間実行されるJSコードを実行することです。このルーチンはPOSTリクエストを生成し、それが終わって必要になると、答えに従って別のリクエストを生成します。

function routine (a)
{
    var answer = createPostRequest (bla bla bla);
    if (answer)
    {
        routine (a);
    }
}

したがって、答えが真である限り、再帰的に自分自身を呼び出します。これまでのところ問題ありませんが、ブラウザがフリーズするか、ハングしすぎます。しばらくすると、Firefoxはスクリプトの実行時間が長すぎることを通知し、スクリプトを停止するように提案します。やる代わりに、タイミング1routine (a);でやろうとしましたsetTimeout。同じことですが、タイミングを100に設定すると、問題ないように見えます。しかし、不必要な待機とその主観的な数があります(100でも問題が発生した場合はどうなりますか?)Delphi / Windowsプログラミングのように、ある種の「メッセージベース」のものが必要です。プログラムはそれ自体にメッセージを送信します。JSでどのように達成できますか?

編集:リクエストを生成する方法:

var ajax = createXmlHttp();
ajax.open ('POST', 'dsdsdsad.adsf', false);
var parameters = 'param=1';
ajax.setRequestHeader ('Content-type', 'application/x-www-form-urlencoded');
ajax.setRequestHeader ("Content-length", parameters.length);
ajax.setRequestHeader ("Connection", "close");
ajax.send (parameters);
try
{
    var answer = eval('(' + ajax.responseText + ')');
}
catch (error)
{
    alert ('Error in the answer: '+ajax.responseText);
    return;
}
4

1 に答える 1

4

createPostRequestコールバックを処理できるAJAX呼び出しを行うと思います。

その場合は、リクエストが非同期であることを確認し、条件をテストして必要に応じて次の呼び出しを行うコールバックを渡します。

function createPostRequest(address, callback) {
    var ajax = createXmlHttp();
    ajax.open ('POST', address, true); // make it async

    var parameters = 'param=1';
    ajax.setRequestHeader ('Content-type', 'application/x-www-form-urlencoded');
    ajax.setRequestHeader ("Content-length", parameters.length);
    ajax.setRequestHeader ("Connection", "close");

        // handle the async response
    ajax.onreadystatechange = function() {
                                if (ajax.readystate == 4) {
                                   try {
                                       callback(eval('(' + ajax.responseText + ')'));
                                   } catch {
                                       callback(null);
                                   }
                                }
                              };
    ajax.send (parameters);
}

function routine (a) {
    createPostRequest (bla bla bla, function(answer) {
        if (answer) {
            routine (a);
        }
    }
}
于 2012-10-08T15:00:39.753 に答える