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