2010-01-23 38 views
0

我有一個鏈接頁面,用戶點擊將我們的api登出Facebook。當你點擊它時,它會調用一個ajax函數,它調用一個php方法從數據庫中刪除用戶密鑰,然後從JS命令調用Facebook api註銷函數。這會調用Facebook並結束用戶會話。一旦註銷,它會刷新頁面。阿賈克斯呼叫被稱爲太快

我的問題是,它似乎並沒有等待數據庫更新完成並註銷Facebook並刷新頁面。由於它沒有完成,信息從不刪除,我的網站永遠不會註銷。每過一段時間,它都會炒作,但每10次點擊就可能發生一次。

我把一個setTimeout 2秒,但它仍然沒有工作。

任何想法?

回答

1

您是否在等待AJAX​​回調?由於這是一個異步請求,因此無法保證它完成,直到它使用status=4調用onreadystatechange()函數。

編輯:什麼我談論的例子:

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); 
    } 
}); 
+0

如何使用此請求?這可以通過$ .get調用完成嗎?而PHP函數只是返回一些與回聲,正確的? – 2010-01-23 01:47:41

+0

在$(document).ready(function(){function。我是新來的整個JS領域,並試圖確保我理解這一切 – 2010-01-23 01:49:32

+0

@Nathan:哪個庫?它看起來像jquery也許?jQuery 'get'需要一個回調函數,這就是你應該把你的後續代碼放在哪裏。 – Aaronaught 2010-01-23 01:55:58

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

我試過這個方法,但它似乎只是坐在那裏,從來沒有拿起回聲返回。 – 2010-01-23 15:41:52

+0

我發現帖子,並認爲它會工作,所以我用這個命令 $。當我直接通過url運行該方法時,我得到這個輸出,這個輸出被回顯,然後在php方法中被殺死。 {「status」:{hi:} { 1} 由於某些原因,該帖子崩潰,並且它從不執行註銷呼叫。任何創意? 我有一個提醒前後,他們都運行。 – 2010-01-24 20:17:16