[英]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的順序為:
該腳本在執行下一行之前將不等待數據返回,因此,當未將下一行稱為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.