2013-08-26 55 views
1

我有下面的代碼如預期CasperJs如何綁定變量?

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

然後後也將是成功的所以它看起來像myData的具有當thenOpen(...)被看作是被初始化。因此,這是預期還是我做錯了什麼?我沒有找到有關此問題的參考。謝謝!

回答

0

這是預期的行爲,因爲casperjs在運行這些步驟之前安排這些步驟。這意味着您的第一個列表JSON.stringify(undefinded)將被髮送到服務器。原因是當您的casper.thenOpen塊的對象被評估時,您的第一塊casper.then塊尚未執行。因此,您的數據尚未正確指定給myData,這發生在步驟內部。

另一方面對POST數據的評估是對於的調用是thenOpen而不是裏面,所以它是同步執行的。

您已經提供了一些不錯的選擇。