【问题标题】:Triggering ajax calls after ajaxOncomplete causes infinite loop在 ajaxOncomplete 之后触发 ajax 调用会导致无限循环
【发布时间】:2015-10-14 05:39:53
【问题描述】:

我已经定义了一个通用的 ajaxComplete 函数,在每个 ajax 请求之后触发如下;

$(document).on('pfAjaxComplete', function(event, xhr, options) {
     doStuff();
});

注意我使用 pfAjaxComplete 而不是 ajaxComplete 在 PrimeFaces 下工作

现在,在每个 ajaxcomplete 上都会调用“doStuff()”函数。问题是在“doStuff()”函数中,我触发了几个基于 PrimeFaces remoteCommand 执行的 ajax 调用

function doStuff() {
  var elements = $('#wrapper').find("[id*='elements']");
  if (elements !== null && elements .length > 0) {
     $.each(elements , function(index) {
       newAjaxCallBack([{name: 'param', value: 'val'}]);
     });
  }
}

我的远程命令

<p:remoteCommand name="newAjaxCallBack" actionListener="#{backingBean.action}" />

这工作正常,正在调用支持 bean 操作方法。问题是“doStuff”上的新 ajax 回调触发了一个新的 ajaxOnComplete 事件,这当然是有道理的,但它让我陷入了无限循环。曾试图解决它,但找不到任何解决方案。

有什么想法或建议吗?有没有办法在 newAjaxCallBack 上发送一个参数,然后在 ajaxComplete 函数上检测它以避免 doStuff 调用?谢谢!

【问题讨论】:

  • newAjaxCallback 是否调用 doStuff()
  • 在调用 doStuff 之前不应该检查完整的事件是否是类型 XYZ
  • @Jack 不,只是触发一个支持 bean 操作方法......但这被视为另一个 ajax 调用,所以它循环
  • @epascarello 确实,但我很难解决这个问题:)

标签: javascript jquery ajax jsf primefaces


【解决方案1】:

一种快速的解决方案是将附加参数附加到您不希望执行其他操作的调用。

如果您选择了一个没有在目标页面上使用的“参数”,它不会在意它。

$(document).ajaxComplete(function(event, xhr, options) {
    if (options.url.indexOf("noStuff=true") != -1){
       alert("Ignoring Ajax Request from noStuff");
        return;
    }
    doStuff();
});

function doStuff(){
   alert("doing stuff");   
    //another fake ajax request
    $.ajax({
        url: "http://google.de", 
        data: [
            {name: 'param', value: 'val'},
            {name: 'noStuff', value: 'true'}
        ]
     });
}

http://jsfiddle.net/3kwhn0kx/

【讨论】:

    【解决方案2】:

    终于让它工作了,解决方案类似于@dognose 一个,在我的情况下,我不得不使用这种方式处理的数据primefaces;

    ...
    $.each(elements , function(index) {
           newAjaxCallBack([{name: 'dontcall', value: 'true'}]);
         });
    ...
    

    然后:

    $(document).on('pfAjaxComplete', function(event, xhr, options) {
        if (xhr.pfSettings.data.indexOf('dontcall') !== -1) {
            return;
        }
        doStuff();
    });
    

    如您所见,我正在使用 pfSettings 对象,它有一个属性“数据”,它基本上是一个字符串,其中包含与请求相关的信息,包括参数,所以如果参数存在,不要做任何事情。

    【讨论】:

      猜你喜欢
      • 2011-08-23
      • 2020-03-09
      • 1970-01-01
      • 2021-06-12
      • 2016-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多