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 是异步的 sendSyncsendAsync 完成后被调用甚至完成。您只是 cannot return 基于异步调用的东西。有关详细信息,请参阅 this question

__utils__.sendAJAX() 不提供可用于异步获取 returned 数据的回调。由于您希望对数据进行 returned,因此您 必须 将异步参数设置为 false。

将异步参数设置为 true 的

__utils__.sendAJAX() 只能用于您对数据 returned 不感兴趣的所谓即发即弃请求。通常您对 returned 数据感兴趣。

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