【问题标题】:getJSON within ajax call causing infinite loopajax调用中的getJSON导致无限循环
【发布时间】:2013-05-17 08:40:58
【问题描述】:

我目前正在调用外部 php 文件并在特定的 div 中显示它们。这一切都是使用标准的 jQuery $.ajax 调用完成的。

但是,当被拉入的页面之一尝试以下 getJSON 调用时会出现问题,从而导致无限循环:

function getContacts() {
  if ($('body.all-contacts').length){
    $.getJSON('assets/data/contacts.json', function(data) {
      var template = $('#contacts-template').html();
      var info = Mustache.to_html(template, data);
      $('.contact-list').html(info);
    });
  }
};

上述函数调用如下:

$(document).ajaxComplete(function(){
....
getContacts();
....
})

我也尝试过使用 ajaxStop() 而不是 ajaxComplete() 但问题仍然存在。

【问题讨论】:

  • 当 ajax 调用完成时,您将启动 ajax 调用。无限循环看起来合乎逻辑。
  • 你为什么在ajaxComplete里面打电话给getContacts()
  • 在初始 ajax 调用(加载外部页面)期间,主体类名称被更新,完成后我需要触发 getContacts 函数,因为它需要对新加载的外部页面起作用。
  • 尝试使用回调而不是ajaxComplete()。例如,创建一个函数setUp(),它将加载您的所有外部文件。一旦 setUp() 完成,调用getContacts()。 (创建回调:stackoverflow.com/questions/8516191/jquery-create-callback
  • 非常感谢大家,回调正是我们所需要的,而不是 ajaxComplete!

标签: jquery ajax getjson


【解决方案1】:

无限循环对我来说似乎很正常。由于您在 getJSON 完成时调用函数 getContacts,因此 getContacts 包含 getJSON 调用,因此该调用将再次触发,这将导致另一个 ajaxcomplete 回调,该回调将再次触发 getContacts 函数。等等等等。

防止这种情况发生,您可以删除 ajaxcomplete 函数中的 getContacts()。

如果您希望保持无限循环,但每次 ajax 调用之间有 时间间隔,您可以使用 javascript 函数 setTimeout。函数格式:
setTimeout("javascript function",milliseconds);

【讨论】:

  • 谢谢凯文,如上所述,回调是问题所在。
【解决方案2】:

getContacts() 调用完成后,不应调用getContacts()

如果您需要调用该函数,当另一个函数完成时,请确保(使用if ...)完成的不是getContacts()

【讨论】:

  • 如何防止它被同一个函数再次触发?只有在最后一次 ajax 调用是 getContacts() 的情况下,我才需要避免触发它吗?
  • 没有。您需要确定,一旦调用了 ajaxcomplete,就不会出现再次进入 getContacts 部分的情况。例如,如果调用xyz() 完成并触发getContacts() 调用,您必须确保这不会触发xyz()。这适用于任意数量的链式调用。祝你好运。
猜你喜欢
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 2011-08-23
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
相关资源
最近更新 更多