我有以下代码,不按预期发布数据
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 。这是预期的还是我做错了什么?我找不到关于这种行为的参考。谢谢!
答案 0 :(得分:0)
这是预期的行为,因为casperjs在运行它们之前安排了这些步骤。这意味着您的第一个列表将JSON.stringify(undefinded)
发送到服务器。原因是当您为casper.then
块评估对象时,您的第一个casper.thenOpen
块尚未执行。因此,您的数据尚未正确分配给myData
,这会在步骤内发生。
另一方面,对POST数据的评估是 thenOpen
调用而不是内部,所以它是同步执行的。
你已经提供了一些不错的选择。