[英]Can I return data from an anonymous callback function in jQuery?
我敢肯定這很簡單,但是我將探討Javascript中的范圍問題。 我正在執行以下操作:
$.get(url, function (data){console.log(data);});
這部分工作正常-我在控制台中看到了想要的字符串。 但是我真正想要的是獲取該數據變量並將其放入字符串中。 這樣的事情(無效):
string = $.get(url, function (data){return data;});
這為string
提供了[object XMLHttpRequest]
的值。
我想念什么?
是的,我錯過了一個事實,正如其名稱所說,Ajax是異步的。 謝謝大家給我拍我需要的額頭。
我之所以不簡單地使用回調函數內部的結果,是因為我實際上需要每隔幾秒鍾執行多個AJAX請求,收集數據並將它們全部添加到頁面之后。
現在,我有了一個小的閉包功能-請求在一個循環中完成,並將數據傳遞到閉包。 當計時器關閉時,我不帶參數的情況下調用了關閉函數,它告訴它“將您的前一批數據追加到頁面上(請求現在肯定已經完成了),清除了緩存,並准備開始從中接收新數據我的循環中的AJAX回調。”
哪一個(希望)表明我畢竟不是白痴。 :)
.get()
發送AJAX GET HTTP請求並立即返回,這意味着您不能僅將結果分配給變量,因為結果僅在成功回調(您作為第二個參數傳遞的匿名函數)中可用。 在此回調中,您可以調用其他函數並將數據作為變量傳遞。 這就是AJAX的工作方式。 A
代表異步。
從回調函數返回數據僅將其返回給該回調函數的調用者,即jQuery,它對此不執行任何操作。
您不能做的就是將該值從回調函數傳遞到周圍函數的賦值中,而您之所以不能這樣做,是因為這將花費時間。 get()
方法立即返回,在后台啟動一個HTTP請求,該請求稍后將完成。 這樣做時,將調用回調函數,但到那時該string
已很久就被分配了。
您不能同步調用異步代碼,反之亦然。 如果要對HTTP請求的結果進行處理,則只能在回調函數中進行處理。 如果要提供一個發出HTTP請求並將結果傳回的函數,則必須自己接受並調用一個回調函數來做到這一點:
function getThing(callback) {
...
$.get(url, function(data) {
callback(data);
});
}
另一種方法是使用async: false
同步完成全部操作。 但這對每個人來說都是個壞消息,因為網絡瀏覽器會掛起直到請求完成。
Ajax請求是異步完成的1 ,JQuery的ajax函數的最后一個參數是回調。 要回答為什么第二個示例不起作用,您需要了解異步回調 。 或者,這類似於觀察者模式,其中observable
observer
是Ajax請求, observer
是回調。 執行請求的步驟大致是:
回調中的參數data
到達步驟6,而$.get()
調用返回到步驟2。因此您的數據不可用。 您需要在第6步中的某個變量中設置數據,然后從那里進行處理。
1個請求可以同步完成,但是Ajax中的A代表Asynchronous 。 可以使用$.get()
來執行同步請求,但是從技術上講,它不能稱為“ Ajax”。 我的觀點。
傳遞給匿名函數的數據變量就是ajax對象本身。 如果要從服務器返回響應文本,請執行以下操作:
$.get(url,
// data to send
{
'foo' : 'bar'
},
// receive response
function(response){
return response;
} // response callback function
); // .get()
您可以執行以下兩項操作之一:
1-將GET更改為與{async: false }
同步,您可能需要使用$ .ajax方法。 然后在成功回調中分配變量。
2-將使用變量的所有內容放入成功回調中。
$.get(url, function (data){
var string = data;
useMyString(string);
});
這是您要嘗試的:
var data = $.get(url, function(data){return data;});
// trying to do the stuff you want to do with data
這是您需要做的:
$.get(url, function(data){
// do the stuff you want to do with data
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.