2014-07-09 3 views
0

저는 CasperJS를 사용하여 사이트를 긁어 내고, 긁어 낸 정보를 구성하는 JSON 객체를 작성한 다음 해당 JSON 객체를 정보를 데이터베이스에 ETL하는 서비스 (PHP)에 게시합니다. .CasperJS가 끝점에 빈 POST 데이터를 보냅니다.

여기에 문제가 있습니다. JSON 객체를 보내려고 할 때마다 객체가 비어 있습니다. 이것은 정보를 보내는 데 사용하는 코드입니다.

casper.then(function(){ 
    var productDetails = {}; 
    this.each(products,function(self, product){ 
     self.thenOpen(product, function(a){ 
      productDetails = this.evaluate(getProductDetails); 
     }); 
     self.thenOpen('http://localhost.endpoint.lan/saveScrapingData.php', { 
      method:'post', 
      data: { 
       name:'Alan', 
       info: productDetails 
      }, 
      headers: { 
       'Content-type': 'application/x-www-form-urlencoded' 
      } 
     }); 
    }); 
}); 

문제는 productDetails이 빈으로 전송되고 있다는 것입니다, 나는이 시점에서 변수를 console.log 때문에 경우 이유를 모르겠어요 :

self.thenOpen(product, function(a){ 
    productDetails = this.evaluate(getProductDetails); 
}); 

변수입니다 비어 있지보다 더 이것은 경주 조건 일 가능성이 높습니다. 변수에 데이터가 포함되기 전에 변수가 전송되었지만 변수가 데이터를 포함하고 있는지를 확인한 후에 데이터를 보내는 경우 왜 이런 일이 발생하는지 이해할 수 없습니다.

답변

2

예, thenOpen을 호출 할 때 productDetails 변수는 아직 정의되지 않았습니다. thenOpen 호출을 thenopen으로 분할하여 open이 실제로 호출 될 때 정의되도록하면됩니다.

self.then(function(){ 
    this.open('http://localhost.endpoint.lan/saveScrapingData.php', { 
     method:'post', 
     data: { 
      name:'Alan', 
      info: productDetails 
     }, 
     headers: { 
      'Content-type': 'application/x-www-form-urlencoded' 
     } 
    }); 
}); 

이는 캐스퍼 단계 (then* 또는 wait*)의 비동기 방식이다. 그들은 예정되어 있지만 나중에 실행됩니다. 문제는 설정 개체를 사용하여 thenOpen을 호출하면 productDetails의 값을 undefined으로 수정한다는 것입니다. 이전 단계가 아직 실행되지 않았기 때문입니다.

관련 문제