从回调中获取数据,然后返回全局变量



我正在尝试从回调中获取数据,并将这些数据放在像这样的全局变量中。

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

在控制台日志中,我变得不确定。如果我在几秒钟后执行X,我会得到正确的数据。

我要做什么?谢谢。

pd:出于刮擦原因,我正在从capybara execute_script中进行此操作,因此我需要返回x,以获取使用estairuate_script的数据。

正如其他答案中提到的那样,这里的真正问题是您要进行异步调用,并且在该呼叫完成后(从Capybara(无法了解。根据您在Capybara使用的驱动程序,有几个潜在的解决方案。

对于所有能够JS的驱动程序,您应该能够将值存储在窗口中的变量中,然后在循环中检索直到NON 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?

应该启动您的初始脚本,然后继续重试直到返回值。请注意,这是天真的,假设将返回非空值,您可能需要超时/更好的值检查,具体取决于返回的数据。

如果使用firefox或chrome的selenium驱动程序,可以使用硒execute_async_script稍微清理一点没有其他参数传递,因此回调脚本是arguments[0](。

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

您正在进行异步调用,因此console.log()发生在AJAX调用返回之前。杰森的示例将为您工作。

Michael在为什么您的实现不起作用方面有一个很好的观点。由于您正在拨打异步调用,因此执行JavaScript的顺序为:

  1. 创建变量x
  2. 发送ajax调用
  3. 执行console.log(x(
  4. 将数据分配给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,因为它需要时间来返回数据返回数据。如果您只是试图从整个功能中返回数据,则可以简化所有内容可能更容易:

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();

相关内容

最新更新