在ajaxOncomplete之后触发ajax调用会导致无限循环

时间:2015-07-23 18:33:56

标签: javascript jquery ajax jsf primefaces

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

$(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}" />

这很好用,正在调用backing bean action方法。问题是'doStuff'上新的ajax回调触发了一个新的ajaxOnComplete事件,这当然有道理,但后来它让我无限循环。曾试图解决它,但找不到任何解决方案。

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

2 个答案:

答案 0 :(得分:1)

快速解决方案是在您不希望执行其他操作的来电中添加其他参数。

如果您选择&#34; paremeter&#34;它没有在目标页面上使用,它不会关心它。

$(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/

答案 1 :(得分:1)

最后得到它的工作,解决方案类似于@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对象,该对象具有属性&#39;数据&#39;这基本上是一个字符串,其中包含与请求相关的信息,包括参数,所以如果参数存在,则不要做任何事情。