簡體   English   中英

我可以從jQuery中的匿名回調函數返回數據嗎?

[英]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是回調。 執行請求的步驟大致是:

  1. 創建一個XmlHttpRequest對象
  2. 建立請求並發送
  3. 等待回應
  4. 收到響應(那里有不同的狀態)
  5. 處理回應
  6. 通知回調

回調中的參數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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM