2014-10-23 2 views
7

È comune avere più metodi then quando si lavora con CasperJS. Il seguente è un esempio:Come passare i dati dai metodi "allora" in CasperJS?

casper.then(function(){ 
    var a = "test"; 
    // ... 
}) 

casper.then(function(){ 
    // how to use the variable a in the first "then" 
}) 

La mia domanda è, qual è il modo comune per passare i valori da ex then s al seguente then s? Per l'esempio di cui sopra, come utilizzare a nel secondo then?

risposta

9

Ci sono molti modi, ma il più semplice sarebbe utilizzare le variabili globali. Se non si vuole ingombrare gli script con variabili globali (che non dovrebbero avere la stessa preoccupazione delle variabili globali nel browser, poiché potrebbero esserci librerie diverse), è possibile utilizzare IIFE per ridurre l'ambito.

casper.start(url); 
(function(casper){ 
    var a; 
    casper.then(function(){ 
     // set a 
    }).then(function(){ 
     // use a 
    }); 
})(casper); 
casper.run(); 

Un'altra versione di quella globale è quello di aggiungere le variabili all'oggetto casper.

Probabilmente la soluzione più pulita sarebbe quella di nidificare quei blocchi che hanno bisogno della variabile. È necessario tenere presente che una chiamata di funzione sincrona non può venire dopo uno asincrono (quelle sono tutte le funzioni di passaggio wait* e then*). I passaggi programmati vengono eseguiti dopo la chiusura della sequenza corrente:

casper.start(url).then(function(){ 
    var a; // set a somehow 
    this.then(function(){ 
     // use a 
    }); 
}).then(function(){ 
    // don't use a 
}).run(); 
+1

Grazie Artjom. Hai risposto a 3 delle mie domande stasera e sono davvero apprezzato! –

+0

Nota che se casper 'then' funziona in modo diverso rispetto alla promessa standard '.then', quindi, sarebbe' casper.then (function() {return someValue;}). Then (function (a) {}); 'funziona come bene? –

+0

@Felix No, non è così che viene attualmente implementato in CasperJS. I valori non possono essere passati ai passaggi successivi. Il valore restituito dal primo 'then' viene passato solo a' casper.options.onStepComplete' e il 'a' che viene passato al secondo' then' è l'ultima risorsa della pagina caricata. –