CasperJS 的 sendAJAX 异步标志设置为 true 失败
CasperJS' sendAJAX asynchronous flag set to true failed
我设置了一个 CasperJS 脚本来调用我的网络服务(运行 on 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 变量成功 returning json 数据。
但是当我将 false 更改为 true 时,它出现了一件奇怪的事情。有时它成功地保存了数据(使用我的网络服务),但是 val 没有 return 正确的值(它是空的,但它应该是 returning json 数据)。但是当我在我的 phpmyadmin 上看到保存数据仍然成功。但有时(几乎总是发生),它无法保存数量数据,而且 returning null(不是 json 数据)
这是怎么回事,在 CasperJS sendAJAX 中使用异步请求有问题吗?
这是异步执行时的预期行为。以下面的代码为例,它是通过使用 setTimeout
函数实现的异步代码:
function sendAsync(){
var returnVal;
setTimeout(function(){
returnVal = sendSync();
}, 100);
return returnVal;
}
由于 setTimeout
是异步的 sendSync
在 sendAsync
完成后被调用甚至完成。您只是 cannot return 基于异步调用的东西。有关详细信息,请参阅 this question。
__utils__.sendAJAX()
不提供可用于异步获取 returned 数据的回调。由于您希望对数据进行 returned,因此您 必须 将异步参数设置为 false。
将异步参数设置为 true 的 __utils__.sendAJAX()
只能用于您对数据 returned 不感兴趣的所谓即发即弃请求。通常您对 returned 数据感兴趣。
有时无法正确发送和保存数据的原因可能是因为这是一个异步过程,并且您的CasperJS脚本在请求完成之前退出,从而终止了您的请求。通过将 async 指定为 true,您实际上从控制流中做了一个微小的中断。
我设置了一个 CasperJS 脚本来调用我的网络服务(运行 on 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 变量成功 returning json 数据。
但是当我将 false 更改为 true 时,它出现了一件奇怪的事情。有时它成功地保存了数据(使用我的网络服务),但是 val 没有 return 正确的值(它是空的,但它应该是 returning json 数据)。但是当我在我的 phpmyadmin 上看到保存数据仍然成功。但有时(几乎总是发生),它无法保存数量数据,而且 returning null(不是 json 数据)
这是怎么回事,在 CasperJS sendAJAX 中使用异步请求有问题吗?
这是异步执行时的预期行为。以下面的代码为例,它是通过使用 setTimeout
函数实现的异步代码:
function sendAsync(){
var returnVal;
setTimeout(function(){
returnVal = sendSync();
}, 100);
return returnVal;
}
由于 setTimeout
是异步的 sendSync
在 sendAsync
完成后被调用甚至完成。您只是 cannot return 基于异步调用的东西。有关详细信息,请参阅 this question。
__utils__.sendAJAX()
不提供可用于异步获取 returned 数据的回调。由于您希望对数据进行 returned,因此您 必须 将异步参数设置为 false。
__utils__.sendAJAX()
只能用于您对数据 returned 不感兴趣的所谓即发即弃请求。通常您对 returned 数据感兴趣。
有时无法正确发送和保存数据的原因可能是因为这是一个异步过程,并且您的CasperJS脚本在请求完成之前退出,从而终止了您的请求。通过将 async 指定为 true,您实际上从控制流中做了一个微小的中断。