我有以下代码段。
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
方法中更新了它)。这个问题是什么原因以及如何解决?
答案 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();
根据您的偏好减少嵌套,这可能是一件好事。