2009-10-28 70 views
33

我試圖調用一個包含jQuery代碼的函數。我想要這個函數返回jQuery語句的結果。它不工作,我試圖找出原因。

function showGetResult (name) { 
    var scriptURL = "somefile.php?name=" + name; 
    return $.get(scriptURL, {}, function(data) { return data; }); 
} 

alert (showGetResult("John")); 

該警報顯示「[object XMLHttpRequest]」。但是,如果我自己運行jQuery語句,除了函數,它可以正常工作 - >$.get(scriptURL, {}, function(data) { alert(data); })

我希望能夠重新使用此代碼,通過將其放入一個函數返回$.get數據。我在這裏犯了什麼根本錯誤?

回答

87

你有幾個不同的錯誤。首先,$ .get不返回回調函數的返回值。它返回XHR對象。其次,get函數不同步,它是異步的,所以showGetResult在完成之前可能會返回。第三,你不能將回調中的東西返回到外部範圍。但是,您可以綁定外部範圍中的變量並將其設置在回調中。

要獲得所需的功能,您需要使用$ .ajax並將異步選項設置爲false。然後,您可以在外部範圍中定義一個變量並將其分配給ajax回調函數,並從該函數返回該變量。

function showGetResult(name) 
{ 
    var result = null; 
    var scriptUrl = "somefile.php?name=" + name; 
    $.ajax({ 
     url: scriptUrl, 
     type: 'get', 
     dataType: 'html', 
     async: false, 
     success: function(data) { 
      result = data; 
     } 
    }); 
    return result; 
} 

你可能會得到更好的服務,但是,搞清楚如何做你在回調函數本身,而不是從異步切換到同步調用想要的東西。

+1

感謝徹底的破解。切換到同步和使用外部變量傳遞數據的組合已經解決了我的問題。 – Kai 2009-10-28 20:12:46

+5

這很好,但請注意,通過切換到同步,您可能會導致瀏覽器在等待響應時鎖定。這可能是一個錯誤,除非你知道你的用戶將永遠在閃電般的連接和你的服務器永遠不會被淹沒。這也與AJAX的含義相反 - 它意味着讓網絡應用程序更具響應能力,但這種變化可能會使您的響應能力下降得更少。 – 2009-10-28 20:17:41

+0

我同意@JacobM最好是在所有可能的情況下使用異步,並在回調中處理您的操作。 – tvanfosson 2009-10-28 21:00:19

1

這是錯誤的做法。該函數(數據)是一個回調函數,所以無論何時返回$ .get將執行..有可能回調函數將不會被調用。

更好的是從函數(數據)方法調用您的發佈數據獲取函數。

9

您所犯的根本錯誤是AJAX調用是異步進行的,所以在您返回時,結果還沒有準備好。爲了使這項工作,你可以修改你的代碼是這樣的:

$(function() { 
    showGetResult('John'); 
}); 

function showGetResult (name) { 
    $.get('somefile.php', { 
     // Pass the name parameter in the data hash so that it gets properly 
     // url encoded instead of concatenating it to the url. 
     name: name 
    }, function(data) { 
     alert(data); 
    }); 
} 
+0

任務就是回到這個「數據」結果,而不是將其打印出來時,從服務器加載。 – Vlado 2017-09-13 20:19:59

2

最基本的錯誤是AJAX的「異步」部分。因爲你不知道服務器發送迴應需要多長時間,所以AJAX方法永遠不會「阻塞」 - 也就是說,你不會向服務器發出呼叫,只是坐在那裏等待結果。相反,你繼續進行其他工作,但是你建立了一個稱爲「回調」的方法,當結果回來時它會觸發。這個方法負責處理數據的任何需要(例如將其注入頁面)。