我设置了一个CasperJS脚本来调用我的Web服务(在localhost:9000上运行)。
包含需要填充的参数的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
的第四个参数中,我将其设置为false,这意味着asynchronous = false。好吧,一切顺利,async = false。那个val变量成功返回了json数据。
但是,当我将虚假变为真时,它会出现一个奇怪的事情。有时它成功保存数据(使用我的webservice),但val没有返回正确的值(它是null,但它应该返回json数据)。但是当我在phpmyadmin上看到时,保存数据仍然是成功的。但有时也(几乎总是发生),它无法保存数据量,仍然,返回null(不是json数据)
所以发生了什么,在CasperJS sendAJAX中使用异步请求有问题吗?
答案 0 :(得分:2)
这是执行异步时的预期行为。以下是使用setTimeout
函数异步的代码:
function sendAsync(){
var returnVal;
setTimeout(function(){
returnVal = sendSync();
}, 100);
return returnVal;
}
由于setTimeout
是异步sendSync
,因此在sendAsync
完成后调用甚至完成。你只是不能根据异步调用返回一些内容。有关详细信息,请参阅this question。
__utils__.sendAJAX()
不提供可用于异步获取返回数据的回调。由于您希望返回数据,因此 将异步参数设置为false。
__utils__.sendAJAX()
只能用于所谓的“即发即弃”请求,其中您对返回的数据不感兴趣。通常您对返回的数据感兴趣。
有时无法正确发送和保存数据的原因可能是因为这是一个异步过程,并且您的CasperJS脚本在请求完成之前退出,从而终止您的请求。通过将async指定为true,您实际上可以从控制流中略微中断。