CasperJs如何绑定变量?

时间:2013-08-26 23:27:41

标签: variables binding casperjs

我有以下代码,不按预期发布数据

var casper = require('casper').create();

var myData;
var utils = require('utils');

casper.start();

casper.then(function () {
    myData = {"source":"casperjs"};
    utils.dump(myData);
});

casper.thenOpen('http://my-api/api/upload/', {
    method: "post",
    data: JSON.stringify(myData),
    headers: {
        "Content-Type":"application/json"
    }   
}, function () {
    utils.dump(myData);
});

casper.run();

邮件已发送到我的服务器但没有有效数据。但是,如果我将 thenOpen(...)移动到然后(...),就像这样

casper.then(function () {
    myData = {"source":"casperjs"};
    utils.dump(myData);
    this.thenOpen('http://my-api/api/upload/', {
        method: "post",
        data: JSON.stringify(myData),
        headers: {
            "Content-Type":"application/json"
        }
    }, function () {
        utils.dump(myData);
    });
});

然后帖子就会成功。或者,如果我更改原始代码中的 thenOpen 部分(即,不将其移动到 casper.then(...)部分,就像这样

casper.thenOpen('http://my-api/api/upload/', {
    method: "post",
    data: JSON.stringify({"source":"casperjs"}),
    headers: {
        "Content-Type":"application/json"
    }   
}, function () {
    utils.dump(myData);
});

然后帖子也会成功。因此,当看到 thenOpen(...)时,似乎必须初始化 myData 。这是预期的还是我做错了什么?我找不到关于这种行为的参考。谢谢!

1 个答案:

答案 0 :(得分:0)

这是预期的行为,因为casperjs在运行它们之前安排了这些步骤。这意味着您的第一个列表将JSON.stringify(undefinded)发送到服务器。原因是当您为casper.then块评估对象时,您的第一个casper.thenOpen块尚未执行。因此,您的数据尚未正确分配给myData,这会在步骤内发生。

另一方面,对POST数据的评估是 thenOpen调用而不是内部,所以它是同步执行的。

你已经提供了一些不错的选择。