1

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

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(...)移动到then (...)中

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);
});

那么帖子也会成功。所以看起来myData必须在看到thenOpen(...)时进行初始化。这是预期的还是我做错了什么?我找不到有关此行为的参考。谢谢!

4

1 回答 1

0

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

另一方面,POST 数据的评估是针对调用而不是内部完成的thenOpen,因此它是同步执行的。

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

于 2014-06-09T16:54:43.547 回答