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

时间:2012-10-08 14:56:07

标签: javascript html recursion

我的任务是做一个长期运行的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;
}

1 个答案:

答案 0 :(得分: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);
        }
    }
}