Javascript:在一段时间后中断递归调用

javascript: break a recursive call after a time duration

本文关键字:中断 递归 调用 一段时间 Javascript      更新时间:2023-09-26

我试图执行一个递归AJAX调用来处理我的应用程序中的一个功能。场景如下:

  1. 执行AJAX函数
  2. 服务器可以返回两个不同的值,例如:字符串A或字符串B
  3. 如果响应是字符串B,则再次调用相同的AJAX函数。

我想确保如果服务器返回字符串B作为响应超过两分钟,递归执行应该停止,并且应该向用户显示一条错误消息。

谁能建议一个合适的方法来做这件事?

下面是JS代码示例。我们正在使用ExtJS:

function process()
{
    Ext.Ajax.request({
        url : "ABC.action",
        form: 'formname',
        params:{
            method : "Serversidehandler",
        },
        success : processSuccess,
        failure : processFail
    }); 
}
function processSuccess(request) 
{
    if(request.responseText != null)
    {
        var responseJSON = Ext.decode(request.responseText);
        var response = responseJSON.response;
        if(response != null) 
        {
            if(response == "A")
            {
                // do something
            }
            else if(response == "B")
            {
                process() // main method called again
            }
        } 
    } 
}

试试下面给出的代码,setTimeout可以很好地处理延迟

请更清楚地说明要求。

 function process()
    {
    
        Ext.Ajax.request({
            url : "ABC.action",
            form: 'formname',
            params:{
                method : "Serversidehandler",
    
            },
            success : processSuccess,
            failure : processFail
    
        }); 
    
    }
    
    function processSuccess(request) 
    {
        if(request.responseText != null)
        {
            var responseJSON = Ext.decode(request.responseText);
            var response = responseJSON.response;
            if(response != null) 
            {
    
                if(response == "A")
                {
                    // do something
                }
                else if(response == "B")
                {
                    window.setTimeout(process(), 2000); // main method called again
                }
    
            } 
        } 
    
    }
var startTime = (new Date).getTime();
function process() {
    Ext.Ajax.request({
        url: "ABC.action",
        form: 'formname',
        params: {
            method: "Serversidehandler",
        },
        success: processSuccess,
        failure: processFail
    });
}
function processSuccess(request) {
    var elapsedTime = 0;
    if (request.responseText != null) {
        var responseJSON = Ext.decode(request.responseText);
        var response = responseJSON.response;
        if (response != null) {
            if (response == "A") {
                // do something
            }
            else if (response == "B") {
                elapsedTime = (new Date().getTime()) - startTime;
                if (elapsedTime <= 2000) {
                    process() // main method called again
                };
            }
        }
    }
}