1

我的任务是做一个长时间运行的 JS 代码。此例程生成一个 POST 请求,当它结束并需要时,根据答案生成另一个:

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

所以只要答案是真的,它就会递归地调用自己。到目前为止它很好,但是浏览器冻结或挂起太多。一段时间后,Firefox 会告诉我脚本运行时间过长,并提出停止它。routine (a);我没有尝试使用计时 1 来做。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 回答