Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从回调中获取数据并返回到全局变量_Javascript_Capybara - Fatal编程技术网

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的执行顺序为:

  • 创建变量x
  • 发送Ajax调用
  • 执行console.log(x)
  • 将数据分配给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调用返回之前发生。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)调用的诀窍是等待数据返回,然后再开始处理它。重复