繁体   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