簡體   English   中英

從回調獲取數據並返回全局變量

[英]Get data from callback and return to global variable

我正在嘗試從回調中獲取數據,並將此數據放入全局變量中,如下所示。

var x;
  CartolaRutAccountAJAXFacade.getCargarValores(dwr.util.byId('combo').value, function(data){
    x = data;
  });

console.log(x);

在控制台日志中,我變得不確定。 如果幾秒鍾后執行x,我將獲得正確的數據。

我該怎么辦? 多謝你們。

PD:出於刮板原因,我正在從水豚執行代碼中執行此操作,因此我需要返回x才能獲取帶有validate_script的數據。

Michael很好地說明了為什么您的實現無法正常工作。 由於您要進行異步調用,因此執行javascript的順序為:

  1. 創建變量x
  2. 傳送Ajax通話
  3. 執行console.log(x)
  4. 將數據分配給x(然后返回數據)

該腳本在執行下一行之前將不等待數據返回,因此,當未將下一行稱為x時,結果尚未分配給數據。


如果您需要以某種方式處理數據,則應創建一個函數並在回調中調用該函數:

var x;

function handleData() {
    console.log(x);
}

CartolaRutAccountAJAXFacade.getCargarValores(dwr.util.byId('combo').value, function(data){
    x = data;
    handleData();
});

另外,您可以根據需要通過參數將數據傳遞給函數,而不是將其分配給x或使用匿名函數。

function handleData(data) {
    console.log(data);
}

CartolaRutAccountAJAXFacade.getCargarValores(dwr.util.byId('combo').value, handleData(data));

回答下面的評論

您將無法在首次執行時第一次返回x,因為Ajax調用需要時間來返回數據。 如果您只是嘗試從整個函數中返回數據,則將所有內容簡化為這樣可能會更容易:

useLoadingMessage();
dwr.engine.beginBatch();

CartolaRutAccountAJAXFacade.getCargarValores(dwr.util.byId('combo').value, function(data){

    console.log(data);

    // You may also want to do this, if you are looking 
    // to return the data from within evaluate_script:
    //
    // return data; 

});

dwr.engine.endBatch();

您正在進行異步調用,因此console.log()發生在AJAX調用返回之前。 傑森的例子將為您工作。

正如其他答案中提到的那樣,這里的真正問題是您正在進行異步調用,並且沒有辦法(從Capybara)知道該調用何時結束。 根據您為Capybara使用的驅動程序,有兩種潛在的解決方案。

對於所有支持JS的驅動程序,您應該能夠將值存儲在window中的變量中,然后在循環中檢索,直到非nil

session.execute_script("CartolaRutAccountAJAXFacade.getCargarValores(dwr.util.byId('combo').value, function(data){
window.my_value = data;})")

begin
  sleep 0.05;
  my_val = session.evaluate_script("window.my_value")
end while my_val.nil?

它將觸發您的初始腳本,然后繼續重試直到返回值。 請注意,這是天真的假設將返回非空值,您可能需要超時/更好的值檢查,具體取決於返回的數據。

如果將selenium驅動程序與Firefox或Chrome結合使用,則可以使用seleniums execute_async_script進行一些清理,該處理將處理所有等待的對象,並且直到回調(直到最后一個參數傳遞到腳本中才會返回)-在這種情況下,傳遞了其他參數,因此回調腳本為arguments[0] )。

session.driver.browser.execute_async_script("CartolaRutAccountAJAXFacade.getCargarValores(dwr.util.byId('combo').value, arguments[0])")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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