CasperJS' sendAJAX异步标志设置为true失败

时间:2015-01-31 18:28:48

标签: ajax casperjs

我设置了一个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中使用异步请求有问题吗?

1 个答案:

答案 0 :(得分:2)

这是执行异步时的预期行为。以下是使用setTimeout函数异步的代码:

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

由于setTimeout是异步sendSync,因此在sendAsync完成后调用甚至完成。你只是不能根据异步调用返回一些内容。有关详细信息,请参阅this question

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

将异步参数设置为true的

__utils__.sendAJAX()只能用于所谓的“即发即弃”请求,其中您对返回的数据不感兴趣。通常您对返回的数据感兴趣。

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