如何在“then *”函数中更新URL?

时间:2014-10-24 00:19:21

标签: javascript casperjs

我有以下代码段。

var admin_url = "http://www.sampledomain.com/";
var casper = require('casper').create();
casper.start();

casper.thenOpen(
    "http://www.test.com", {
        method: "post",
        data: {
            param1: "some data"
        }
    },
    function() {
        what_i_want = this.getPageContent().split("[")[1].split("]")[0]
        admin_url += what_i_want;
    }
);

casper.thenOpen(admin_url, function() {
    this.echo(this.getCurrentUrl());
});

casper.run();

我首先发布到http://www.test.com,然后使用返回的数据,我尝试修改admin_url,这是我需要访问的第二个URL。但是,我的测试显示第二个thenOpen方法仍然具有旧的admin_url值并且未获取最新的更新值(请注意我已在第一个thenOpen方法中更新了它)。这个问题是什么原因以及如何解决?

1 个答案:

答案 0 :(得分:1)

当您调用thenOpen时,admin_url按值传递,但thenOpen本身是异步执行的。您可以这样看:向队列添加一些步骤,当您调用run时,队列开始执行初始步骤及其附带的数据。因此,当thenOpen完成时,您需要将最后admin_url步骤动态添加到队列中:

casper.thenOpen(
    "http://www.test.com", {
        method: "post",
        data: {
            param1: "some data"
        }
    }, function then() {
        whatIWant = this.getPageContent().split("[")[1].split("]")[0]
        admin_url += video_id;

        this.thenOpen(admin_url, function() {
            this.echo(this.getCurrentUrl());
        });
    }
);

casper.run();

还有可能将thenOpen分解为其子函数并使用admin_url作为全局变量:

var admin_url = "...";
casper.thenOpen(
    "http://www.test.com", {
        method: "post",
        data: {
            param1: "some data"
        }
    },
    function() {
        what_i_want = this.getPageContent().split("[")[1].split("]")[0]
        admin_url += what_i_want;
    }
).then(function() {
    this.open(admin_url);
}).then(function() {
    this.echo(this.getCurrentUrl());
}).run();

根据您的偏好减少嵌套,这可能是一件好事。