Javascript 从回调中获取数据并返回到全局变量
我试图从回调中获取数据,并将这些数据放入一个全局变量中,如下所示Javascript 从回调中获取数据并返回到全局变量,javascript,capybara,Javascript,Capybara,我试图从回调中获取数据,并将这些数据放入一个全局变量中,如下所示 var x; CartolaRutAccountAJAXFacade.getCargarValores(dwr.util.byId('combo').value, function(data){ x = data; }); console.log(x); 在控制台日志中,我没有定义。 如果我在几秒钟后执行x,我会得到正确的数据 我该怎么办?谢谢大家 PD:我从capybara execute_脚本执行此操作是出
var x;
CartolaRutAccountAJAXFacade.getCargarValores(dwr.util.byId('combo').value, function(data){
x = data;
});
console.log(x);
在控制台日志中,我没有定义。
如果我在几秒钟后执行x,我会得到正确的数据
我该怎么办?谢谢大家
PD:我从capybara execute_脚本执行此操作是出于抓取的原因,因此我需要返回x以使用evaluate_脚本获取数据。Michael很好地解释了为什么您的实现不起作用。由于您正在进行异步调用,因此javascript的执行顺序为:
如果需要以某种方式处理数据,则应创建一个函数并在回调函数中调用该函数:
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调用返回之前发生。Jason的例子对您很有用。正如其他答案中提到的,这里真正的问题是您正在进行异步调用,并且无法知道(从水豚那里)调用何时完成。根据您使用的水豚驱动程序,有两种可能的解决方案
对于所有支持JS的驱动程序,您应该能够将值存储在窗口中的变量中,然后在循环中检索,直到非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执行异步脚本
稍微清理一下,该脚本将处理所有等待您的操作,并且在回调之前不会返回(作为最后一个参数传递到脚本中-在这种情况下,没有传递其他参数,因此回调脚本是参数[0]
)
session.driver.browser.execute_async_script("CartolaRutAccountAJAXFacade.getCargarValores(dwr.util.byId('combo').value, arguments[0])")
它对我不起作用,我真正想要的是在第一次执行时返回该值。这是代码和结果。抱歉,直到现在才看到。您需要数据做什么?在代码中,您已将数据分配给x,现在您可以使用该数据(x)执行某些操作。将
x
放入函数不会有任何作用,因为它只是一个变量。您很可能需要在x上执行某些函数。我在上面的答案中添加了一些信息。在您发布的图像中,看起来您正在调用handleData()两次。这可能就是您看到未定义的原因。如果它只查找一组数据,那么当您第一次返回x时,它将是未定义的。异步(ajax)调用的诀窍是等待数据返回,然后再开始处理它。重复