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

その後、投稿も成功します。そのため、 thenOpen(...)が表示されたときにmyDataを初期化する必要があるようです。それで、これは期待されているのですか、それとも私は何か間違ったことをしましたか? この動作に関する参照が見つかりませんでした。ありがとう!

4

1 に答える 1

0

casperjs はステップを実行する前にスケジュールを設定するため、これは予想される動作です。JSON.stringify(undefinded)これは、サーバーに送信される最初のリストを意味します。その理由はcasper.then、オブジェクトがブロックに対して評価されるときに、最初のブロックがまだ実行されていないためcasper.thenOpenです。したがって、データはまだ に適切に割り当てられていませんmyData。これはステップ内で発生します。

一方、POST データの評価は内部ではなく呼び出しに対して行われるためthenOpen同期的に実行されます。

あなたはすでにいくつかの良い代替案を提供しています。

于 2014-06-09T16:54:43.547 に答える