0

所以情况如下:

我有一个从服务器提取数据的递归异步 AJAX 调用。此递归调用仅在用户登录时发生一次。我有另一个页面需要 AJAX 调用才能导航(基本上是延迟加载的树)。当第一个 AJAX 调用发生时,这些其他调用需要一段时间才能完成,而且由于第一个调用可能会发出多达 2,000 个请求,因此这种延迟有时会相当长。

基本上我想要实现的是在进行另一个调用时“暂停”递归调用。伪代码:

function recursiveAjax(){    
    $.ajax( {
        async : true,
        url : 'someurl',
        dataType : 'json',
        beforeSend : function(xhr) {
            // do stuff
        },
        error : function(xhr, ajaxOptions, thrownError) {
            // handle errors
        },
        success : function(data) {
            //conditions
            recursiveAjax();
        }
    });
}

function navigationAjax(){    
    $.ajax( {
        async : true,
        url : 'someurl',
        dataType : 'json',
        beforeSend : function(xhr) {
            // pause recursiveAjax();
        },
        error : function(xhr, ajaxOptions, thrownError) {
            // handle errors
        },
        success : function(data) {
            //conditions
            // resume recursiveAjax();
        }
    });
}
4

3 回答 3

2

最简单的方法:

window.recurse = true;
function recursiveAjax(){    
    $.ajax( {
        async : true,
        url : 'someurl',
        dataType : 'json',
        beforeSend : function(xhr) {
            // do stuff
        },
        error : function(xhr, ajaxOptions, thrownError) {
            // handle errors
        },
        success : function(data) {
            //conditions
            if(window.recurse){
               recursiveAjax();
            }
        }
    });
}

function navigationAjax(){    
    window.recurse=false;
    $.ajax( {
        async : true,
        url : 'someurl',
        dataType : 'json',
        beforeSend : function(xhr) {
            // pause recursiveAjax();
        },
        error : function(xhr, ajaxOptions, thrownError) {
            // handle errors
        },
        success : function(data) {
            //conditions
            window.recurse=true;
            recursiveAjax();
        }
    });
}
于 2012-07-05T13:26:39.500 回答
1

JavaScript 是一种异步语言,因此您可以像在其他注释中一样使用回调(见上文)。但是想想你的问题,大多数时候最好在 web 中异步工作。你真的想要这个吗?

于 2012-07-05T13:29:49.937 回答
1

由于您可能不希望同时执行两个请求,因此让递归方法执行其中一个。当您需要导航调用时设置一个标志,并让递归方法执行该请求下一次迭代:

var navigationCall = false;

function recursiveAjax(){
  if (navigationCall) {
    navigationCall = false;
    $.ajax( {
      async : true,
      url : 'someurl',
      dataType : 'json',
      error : function(xhr, ajaxOptions, thrownError) {
        // handle errors
      },
      success : function(data) {
        //conditions
        recursiveAjax();
      }
    });
  } else {
    $.ajax( {
      async : true,
      url : 'someurl',
      dataType : 'json',
      beforeSend : function(xhr) {
        // do stuff
      },
      error : function(xhr, ajaxOptions, thrownError) {
        // handle errors
      },
      success : function(data) {
        //conditions
        recursiveAjax();
      }
    });
  }
}

function navigationAjax(){
  navigationCall = true;
}

注意:您可能希望添加一个window.TimeOut调用来执行递归,以限制对服务器的请求流。调用服务器的频率超过人眼可以看到的变化是没有意义的。

于 2012-07-05T13:42:16.213 回答