2016-10-25 97 views
-3

我知道很多其他時間都有人問過類似的問題,但我的案例比較具體,據我所知,以前從未涉及過。至少從我能找到的。在繼續使用Javascript代碼之前等待AJAX​​返回成功?

我在做什麼是使用UID構建對象。該對象所構建的所有東西都需要這個UID,並且需要在它完成任何事情之前將其驗證爲唯一的。

我在JavaScript中隨機生成UID,我正在對SQL數據庫中的所有其他條目進行檢查。我使用PHP和Ajax發佈到數據庫。

我遇到的核心問題是Javascript不會等待Ajax響應,而是繼續滾動。 Ajax必須使用成功處理程序。這對我來說是絕對不可能的,因爲我不能做任何事情,直到我確定UID已被驗證。

是否有任何解決方法或解決方案?承諾是行不通的,因爲正如我之前所說的那樣,UID在構建對象本身時是不可或缺的,所以使用佔位符將不起作用。

在此先感謝!

+0

如果您使用jQuery,請查看$ .ajax的'async'設置(將其設置爲'false') - 另請參閱http://api.jquery.com/jQuery.ajax/ – Andreas

+1

so .. ..爲什麼你不能等待創建一個對象,直到你的第一個Ajax調用返回成功?您可以從該成功回調中踢對象創建方法,對吧? –

+0

看起來您正在客戶端生成UID,然後從服務器/數據庫進行驗證。你不能在服務器上生成已驗證的UID並在第一次加載時傳遞給頁面嗎? –

回答

1

您只需發送一個同步Ajax請求,這樣的:

var response = $.ajax({ url : "http://api.jquery.com/jquery.ajax/", async : false }); 

(雖然這不是一個很好的做法)

+0

這就是我試圖避免使用'async:false'。我也意識到很顯然,在許多瀏覽器中不贊成使用異步,這是另一個值得關注的問題。 異步是否阻止_all_ Javascript運行,或者它只會阻止該特定堆棧繼續運行? – Kats

+0

是的,但是它的行爲就像第一次加載頁面一樣,所以一切都要等到成功返回時! – Dennisrec

+0

它基本上鎖定了瀏覽器。這就是爲什麼同步呼叫被高度拒絕 –

0

確定。一種可能的解決方案,如果您的UID隨機生成在服務器上,您可以使用腳本標記直接將其提供給index.html。

<head> 
<script src="path_to_url_that_provides_generated_script"></script> 
<script .... other scripts></script> 
</head> 

而這個生成的腳本會是這樣的:

var UID = "xxxx-xxxx-xxxx-xxxx"; 

這樣,你甚至都不需要做一個Ajax請求,因爲處理的任何其他腳本之前你的uid會知道。

0

我發現,最好的方法是重寫我的代碼,直到我有了UID纔開始創建對象。雖然這確實需要花費相當多的時間來完成並確保不存在笨拙的錯誤,但沒有其他真正的解決方案既簡單又有效。

事實證明,預見性總是讓優秀程序員不再編寫和重寫他們的工作。

特別感謝@Vladimir M的解決方案。

相關問題