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