Ajax вызывает слишком быстро - PullRequest
0 голосов
/ 23 января 2010

У меня есть страница со ссылкой, которую пользователь нажимает, чтобы вывести наш API из Facebook. Когда вы нажимаете на нее, она вызывает функцию ajax, которая вызывает метод php для удаления ключей пользователей из нашей базы данных, а затем вызывает функцию выхода из API api Facebook из команды JS. Это вызывает Facebook и завершает сеанс пользователей. Выйдя из системы, она обновляет страницу.

Моя проблема заключается в том, что, похоже, он не ждет завершения обновления базы данных, а также выхода из Facebook и обновления страницы. Поскольку он не завершает его, информация никогда не удаляется, и мой сайт никогда не выходит из системы. Время от времени это работает, но, может быть, один раз каждые 10 кликов.

Я установил setTimeout на 2 секунды, но он все равно не работал.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 23 января 2010

Не используйте setTimeout, чтобы попытаться рассчитать последующее действие для вызова Ajax. Вместо этого используйте функцию обратного вызова; таким образом, он гарантированно будет выполняться только после завершения вызова Ajax.

1 голос
/ 23 января 2010

Согласно комментариям, я вижу, что вы используете jQuery. В этом случае вам просто нужно передать функцию обратного вызова в качестве аргумента функции. Также см. Документацию jQuery.get .

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

или

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

// ...

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

Чтобы узнать больше о jQuery, я настоятельно рекомендую узнать, как найти / прочитать / интерпретировать их онлайн-документацию. Это действительно отлично. На домашней странице также есть раздел Tutorials . JQuery не просто JavaScript. Это библиотека на основе JavaScript.

1 голос
/ 23 января 2010

Вы ждете обратного вызова 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);
   }
 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...