我正在尝试从回调中获取数据,并将这些数据放在像这样的全局变量中。
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的顺序为:
- 创建变量x
- 发送ajax调用
- 执行console.log(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,因为它需要时间来返回数据返回数据。如果您只是试图从整个功能中返回数据,则可以简化所有内容可能更容易:
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();