[英]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.