2011-06-24 68 views
2

我有一些代碼的麻煩。我使用console.log()來輸出變量的內容,但它似乎$.post()需要很長的時間,因此我的變量沒有被正確設置。這是我的代碼。

$.tmsmm = { 
    duplicate_meeting : "something" 
}; 
$.post("scripts/check_duplicate_meetings.php", { meeting_date: meeting_date, meeting_type: meeting_type }, function(data) { 
    $.tmsmm.duplicate_meeting = data; 
    console.log("myVar: " + $.tmsmm.duplicate_meeting); 
}); 

console.log("myVar2: " + $.tmsmm.duplicate_meeting); 

什麼是輸出:

myVar2:東西
myVar的:這是阿賈克斯的數據!

正如您所看到的,myVar2在myVar之前被記錄。我如何解決這個問題?

UPDATE:之所以這個方案適合我的情況最好VS呼籲成功或使用.post的$完成的功能是,我有很多的代碼,這個樣本是取決於變量值之後到來。我只記錄了2次不同的時間值,以解決爲什麼我的變量沒有設置在$ .post函數之外的原因。感謝大家的幫助!

回答

0

您可以強制Ajax調用是通過使用$阿賈克斯和使用async屬性同步。但是,這可能會導致瀏覽器掛起,應該避免。

http://api.jquery.com/jQuery.ajax/

然而,失敗擺在首位用ajax的目的。你的例子並沒有太多意義。爲什麼您在獲得退貨前需要檢查duplicate_meeting

+1

+1 - 正是我要寫的。對於OP,請注意,有些瀏覽器可能會掛起或停止呈現,直到現在的同步請求完成。 – Bojangles

+1

如果您可以偵聽「完成」或「成功」事件,爲什麼將其設置爲「異步」? – Shef

+0

好點Shef。 – Bojangles

1

POST請求異步發生。因此,在您發出post請求後,立即執行跳至底部的console.log。您需要處理回調中的任何響應。

2
$.tmsmm = { 
    duplicate_meeting : "something" 
}; 
$.post("scripts/check_duplicate_meetings.php", { meeting_date: meeting_date, meeting_type: meeting_type }, function(data) { 
    $.tmsmm.duplicate_meeting = data; 
    console.log("myVar: " + $.tmsmm.duplicate_meeting); 
    console.log("myVar2: " + $.tmsmm.duplicate_meeting); 
}); 

將myVar2放入$ .post回調函數中,以在myVar之後顯示它。

+0

+1這就是我的回答。看起來是最簡單和最有效的解決方案。 –

1

把成功函數中的MYVAR 2碼$。員額。這樣,你確保它只有在$ .post成功時才能運行。

這裏你可以看到一個例子: http://api.jquery.com/jQuery.post/

0

你的第二個電話到CONSOLE.LOG()是要每次先完成。第一次調用將在成功完成ajax調用後發生,並且執行上下文將發生得如此之快以至於第二次調用將首先發生。

1

$.post是異步的。回調將在服務器返回任何內容時運行,而不是之前。 console.log直接在它之後,並且在服務器返回響應之前將同步運行。

您可以將console.log代碼移入回調,或使用$.ajax並將async選項設置爲false。後面的選項很瘋狂,你基本上不應該這樣做,因爲瀏覽器會凍結(完全!),直到你的服務器響應。請參閱:http://api.jquery.com/jQuery.ajax

-1

嘗試更改check_duplicate_meetings。PHP只是有

<?php echo 'hi'; ?> 

例如,

然後你可以看到,如果它在你的PHP文件中的錯誤。變量'data'不會被加載我認爲如果PHP文件有錯誤發生。

如果確實有錯誤,請嘗試運行check_duplicate_meetings.php,並在文件的開頭手動設置變量以對其進行測試。

+0

這不是PHP的問題 - '$ .post'請求是異步發送的,這意味着它之後的任何代碼都不會等待服務器返回數據;它會繼續下去。 – Bojangles

1

嘗試

var checkDuplicateMeetings = $.post("scripts/check_duplicate_meetings.php", { meeting_date: meeting_date, meeting_type: meeting_type }, function(data) { 
    $.tmsmm.duplicate_meeting = data; 
    console.log("myVar: " + $.tmsmm.duplicate_meeting); 
}); 

checkDuplicateMeetings.complete(function(){ 
    console.log("myVar2: " + $.tmsmm.duplicate_meeting); 
}); 

爲背景,我與complete事件在這裏展示它。但是,您可以根據需要使用successerror事件。監聽complete事件將確保您的代碼將成爲請求成功完成或發生錯誤後運行的最後一位。如果您想檢查並運行成功或失敗的特定代碼,請相應地監聽successerror事件。