2010-01-23 2 views
0

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

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

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

Любые идеи?

ответ

1

Вы ждете обратного вызова AJAX? Поскольку это асинхронный запрос, вам не гарантируется, что он будет закончен, пока он не вызовет функцию onreadystatechange() с status=4.

EDIT: Пример того, что я говорю о:

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(); 

EDIT 2: Чтобы уточнить ваши вопросы в комментариях:

1) Да, PHP просто имеет сделать эхо. Это не обязательно - я просто добавил, что в качестве примера, чтобы убедиться, что запрос закончен не потому, что он не прошел/получил прерван.

2) Что касается $.get и друзей, это jQuery, а не чистый Javascript, который имеет свои собственные инструменты. В JQuery вы бы написать что-то вроде:

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

Как этот запрос используется? это можно сделать с помощью вызова $ .get? И функция php просто возвращает что-то с эхом, правильно? –

+0

, который находится в $ (document) .ready (function() {function. Я новичок во всей сфере JS и стараюсь, чтобы я все понял –

+0

@Nathan: какая библиотека? Похоже, что jquery может быть? JQuery 'get' принимает функцию обратного вызова, вот где вы должны поместить свой контрольный код. – Aaronaught

1

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

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.

+0

Я пробовал этот метод, но он, кажется, просто сидит и никогда не поднимается на возврат эха. –

+0

Я нашел сообщение и подумал, что это будет работа, поэтому я использовал эту команду $.post (domain, {subject: 'Hi'}, function (data) { , и когда я запускаю метод непосредственно через URL-адрес, я получаю этот вывод, который затем повторяется, затем уничтожается из методов php. {"status": 1} по какой-то причине сообщение сбой и его никогда не выполняет выход из системы. Любые идеи? У меня есть предупреждение до и после, и они оба запускаются. –

Смежные вопросы