2010-04-17 101 views
2

這可能真的很愚蠢,但我找不到我的代碼的問題。它獲取返回JSON的URL,然後該函數應該返回一個字符串:

function getit() { 
    var ws_url = 'example.com/test.js'; 
    var user = false; 

    $.getJSON(ws_url, function(data) { 
    alert('user '+data.user);//shows john 
    user = data.user || false; 
    }); 

    return user;//should return john but returns false 
} 

test.js都會有這樣的事情:

{"id":"12","username":"ses","user":"john","error":""} 

或像這樣:

{"error":"123"} 

我也試過if (data.user) {} else {}但它也沒有工作..

所以我錯過了什麼?

謝謝:)

回答

4

的問題來自於一個事實,即$.getJSON()調用是異步的。一旦ajax請求被觸發,處理繼續在getit()之內,你的函數立即返回false。稍後,Ajax響應會返回並設置user,但很久以前您的getit()函數return已編輯!

您可以強制Ajax調用使用async選項,這樣是同步的:

$.ajax({ 
    async: false, 
    url: ws_url, 
    type: "GET", 
    success: function(data) { 
     alert('user '+data.user);//shows john 
     user = data.user || false; 
    } 
    }); 

如果你這樣做,你的瀏覽器將在腳本塊,直到Ajax調用返回。通常這不是理想的行爲(這就是爲什麼默認值爲async: true),所以我建議重新調用它,即調用getit(),並且期望在可能的時候處理它的結果,也許通過傳遞它自己的回調函數到getit(),然後在getit()完成時執行。

2

阿賈克斯是異步的,這意味着腳本的其餘部分是不會坐下來等待它在移動之前完成。和你的例子一樣,在ajax函數接收到來自服務器的響應之前,return行已經到達,因此用戶變量在那個時間點仍然是錯誤的。

如果要強制ajax調用同步運行,可以使用jQuerys $.ajax方法並將async參數設置爲false。

$.ajax({ 
    url:ws_url, 
    dataType:"json", 
    async:false, 
    success:function(data){ 
    alert('user '+data.user);//shows john 
    user = data.user || false; 
    } 
});