J'utilise CasperJS pour gratter un site, créer un objet JSON pour organiser les informations scraper, puis POSTER cet objet JSON à un service (en PHP) que ETLs l'information dans une base de données.
Voici le problème, chaque fois que j'essaie d'envoyer l'objet JSON, l'objet est vide, c'est le code que j'utilise pour envoyer les informations.
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' } }); }); });
Le problème est que productDetails est envoyé en tant que vide, et je ne sais pas pourquoi parce que si je console.log
la variable à ce stade:
self.thenOpen(product, function(a){ productDetails = this.evaluate(getProductDetails); });
La variable n'est pas vide, plus que probable, c'est une condition de course. La variable est envoyée avant qu'il ne contienne de données, mais je ne comprends pas pourquoi cela se produit, si j'envoie les données après que je suis sûr que la variable contient des données.
Oui, au moment de l'appel, thenOpen
la variable productDetails
est encore indéfinie. Vous pouvez simplement diviser l'appel thenOpen
en then
et open
afin qu'il soit défini lorsque l' open
est effectivement appelée.
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' } }); });
C'est en raison de la manière asynchrone des étapes casper ( then*
ou wait*
). Ils sont programmés mais exécutés plus tard. Le problème est qu'en appelant thenOpen
avec l'objet de configuration, la valeur de productDetails
undefined
comme undefined
puisque l'étape précédente n'a pas encore été exécutée.