2015-01-31 65 views
1

我设置了一个CasperJS脚本来调用我的web服务(在localhost:9000上运行)。CasperJS的sendAJAX异步标志设置为true失败

包含需要填充的参数的webservice。比方说一个金额参数,我的webservice从其参数中保存金额数据。所以我写了我的CasperJS这样的脚本:

casper.then(function(){ 
    val = this.evaluate(function(){ 
     //do step #1 ajax request 

     var country_amount = 9; 
     var params   = "amount="+country_amount; 
     var data   = "amount="+country_amount; 
     var wsurl   = "http://localhost:9000/TempCountryAmountREST/setCountryAmount?amount="+country_amount; 
     //window.__utils__.echo("Country Amount :"+country_amount); 
     return JSON.parse(__utils__.sendAJAX(wsurl, "POST" , null, false, { contentType: "application/json" })); 
    }); 
}); 

正如你所看到的,在__utils__.sendAJAX第四个参数,我设置了假,这意味着异步=假。那么,一切顺利async = false。该val变量成功返回json数据。

但是当我将false改为true时,会出现一个奇怪的事情。有时它会成功保存数据(使用我的web服务),但val不会返回正确的值(它为空,但它应该返回json数据)。但是当我在我的phpmyadmin上看到保存数据仍然是成功的。但有时也会发生(几乎总是发生),它不能保存数据量,仍然返回null(不是json数据)。

那么发生了什么事,在CasperJS sendAJAX中使用异步请求有问题吗?

回答

2

这是执行异步时的预期行为。举个例子下面的代码,其是通过使用setTimeout函数异步:

function sendAsync(){ 
    var returnVal; 
    setTimeout(function(){ 
     returnVal = sendSync(); 
    }, 100); 
    return returnVal; 
} 

由于setTimeout是异步sendSync被调用或之后sendAsync饰面甚至结束。您只需不能返回基于异步调用的内容。有关更多信息,请参阅this question

__utils__.sendAJAX()不提供可用于异步获取返回数据的回调。既然你想要返回数据,你的设置异步参数为false。

__utils__.sendAJAX()将异步参数设置为true只能用于所谓的即发即用请求,您对返回的数据不感兴趣。通常你对返回的数据感兴趣。

它有时无法正确发送和保存数据的原因可能是因为这是一个异步过程,并且在请求完成之前退出CasperJS脚本,从而终止您的请求。通过将异步指定为true,您基本上可以从控制流中脱离出来。