【问题标题】:CasperJS' sendAJAX asynchronous flag set to true failedCasperJS 的 sendAJAX 异步标志设置为 true 失败
【发布时间】:2015-01-31 18:28:47
【问题描述】:

我设置了一个 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 数据。

但是当我将 false 更改为 true 时,它​​会出现一个奇怪的事情。有时它成功保存了数据(使用我的 web 服务),但 val 没有返回正确的值(它为 null,但它应该返回 json 数据)。但是当我在我的 phpmyadmin 上看到时,保存数据仍然成功。但有时也是如此(几乎总是发生),它无法保存数量数据,并且仍然返回 null(不是 json 数据)

那么这是怎么回事,在 CasperJS sendAJAX 中使用异步请求有问题吗?

【问题讨论】:

    标签: ajax casperjs


    【解决方案1】:

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

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

    由于setTimeout 是异步的,sendSyncsendAsync 完成后被调用甚至完成。您只是无法基于异步调用返回某些内容。请参阅this question 了解更多信息。

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

    __utils__.sendAJAX() 将异步参数设置为 true 只能用于所谓的即发即弃请求,您对返回的数据不感兴趣。通常你对返回的数据感兴趣。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多