ajax调用调用太快

时间:2010-01-23 01:35:18

标签: jquery html ajax facebook

我有一个带有链接的页面,用户点击该链接将我们的api记录在Facebook之外。单击它时,它调用一个调用php方法的ajax函数从我们的数据库中删除用户键,然后从JS命令调用Facebook api注销函数。这会调用Facebook并结束用户会话。注销后,它会刷新页面。

我的问题是它似乎没有等待数据库更新完成和注销Facebook并刷新页面。由于它没有完成它,信息永远不会被删除,我的网站永远不会退出。每隔一段时间,它就会发生一次,但也许每10次点击一次。

我输入了一个setTimeout 2秒钟,但它仍无法正常工作。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您在等待AJAX​​回调吗?由于它是异步请求,因此在用onreadystatechange()调用status=4函数之前,不能保证它已完成。

编辑:我正在谈论的一个例子:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4 && xhr.responseText == 'logged out successfully') {
    facebookLogout(uid);
  }
}
xhr.open('GET', 'http://example.com/my_logout.php?uid=' + uid, true);
xhr.send();

编辑2:在评论中澄清您的问题:

1)是的,PHP只需做一个回声。这没有必要 - 我只是添加了一个例子来确保请求没有完成,因为它失败/被中止。

2)对于$.get和朋友,这是jQuery而不是纯Javascript,它有自己的工具。在jQuery中你会写一些类似的东西:

$.get('my_logout.php?uid=' + uid, function(data) {
   if (data == 'logged out successfully') {
     facebookLogout(uid);
   }
 });

答案 1 :(得分:1)

请勿使用setTimeout尝试对Ajax调用进行后续操作。改为使用回调函数;这样就保证只在Ajax调用完成后执行。

答案 2 :(得分:1)

根据评论,我看到你正在使用jQuery。在这种情况下,您只需要将回调函数作为函数参数传入。另请参阅jQuery.get documentation

$.get('foo.php', function() {
    alert('Finished!');
});

$.get('foo.php', functionname);

// ...

function functionname() {
    alert('Finished!');
}

要了解有关jQuery的更多信息,我强烈建议您学习如何查找/阅读/解释其在线文档。这真的很棒。主页上还有一个Tutorials section。 jQuery不是只是 JavaScript。这是一个基于JavaScript的库。