JavaScript例程如何调用自身?(不是递归的!)

JavaScript例程如何调用自身?(不是递归的!),javascript,html,recursion,Javascript,Html,Recursion,我的任务是编写长时间运行的JS代码。此例程生成POST请求,当其结束并需要时,根据答案生成另一个POST请求: function routine (a) { var answer = createPostRequest (bla bla bla); if (answer) { routine (a); } } 因此,只要答案为真,它就会递归地调用自己。到目前为止还不错,但随后浏览器冻结或挂起太多。过了一段时间,Firefox会告诉我脚本运行时间太

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

function routine (a)
{
    var answer = createPostRequest (bla bla bla);
    if (answer)
    {
        routine (a);
    }
}
因此,只要答案为真,它就会递归地调用自己。到目前为止还不错,但随后浏览器冻结或挂起太多。过了一段时间,Firefox会告诉我脚本运行时间太长,并提出停止它。 而不是执行
例行程序(a)我尝试使用
设置超时
计时1。同样的事情,但当我设定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;
}

我假设您的
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);
}


我假设您的
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);
}


递归函数的定义是一个调用自身的函数。如果此“createPostRequest”正在异步执行某些操作,则您的答案是从异步操作的回调调用该函数。@JohnSmith:如果它们不能异步,然后你的浏览器将被锁定直到请求停止。我认为你需要考虑做一个异步的帖子。jQuery和Dojo提供了api来帮助实现这一点。您可以在这里找到进一步的信息:如果请求实际上是同步完成的,您将不会看到您描述的行为。您应该发布
createPostRequest()
的代码。递归函数的定义是一个调用自身的函数。如果此“createPostRequest”正在异步执行某项操作,则您的答案是从异步操作的回调调用该函数。@JohnSmith:如果它们不能异步,然后你的浏览器将被锁定直到请求停止。我认为你需要考虑做一个异步的帖子。jQuery和Dojo提供了api来帮助实现这一点。您可以在这里找到进一步的信息:如果请求实际上是同步完成的,您将不会看到您描述的行为。您应该发布
createPostRequest()
的代码。