2014-10-23 9 views
7

Es ist üblich, mehrere then Methoden zu verwenden, wenn Sie mit CasperJS arbeiten. Es folgt ein Beispiel:Wie übertrage ich Daten von den "then" -Methoden in CasperJS?

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

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

Meine Frage ist, was ist der gemeinsame Weg, um Werte, um von früheren then s zu folgenden then s? Für das oben genannte Beispiel, wie man a im zweiten then benutzt?

Antwort

9

Es gibt viele Wege, aber am einfachsten wäre es, globale Variablen zu verwenden. Wenn Sie Ihre Skripts nicht mit globalen Variablen überladen möchten (die nicht mit den gleichen Problemen wie globale Variablen im Browser zu tun haben sollten, da dort möglicherweise andere Bibliotheken vorhanden sind), können Sie IIFEs verwenden, um den Gültigkeitsbereich zu reduzieren.

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

Eine andere Version des globalen ist diese Variablen auf das casper Objekt hinzuzufügen.

Wahrscheinlich wäre die sauberste Lösung, die Blöcke zu verschachteln, die die Variable benötigen. Beachten Sie, dass ein synchroner Funktionsaufruf nach einem asynchronen Funktionsaufruf nicht kommen kann (das sind alle wait* und then* Schrittfunktionen). Geplante Schritte werden nach dem Ende des aktuellen Staps ausgeführt:

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

Danke Artjom. Du hast heute Nacht 3 meiner Fragen beantwortet und ich bin sehr geschätzt! –

+0

Beachten Sie, dass caspers 'then' anders funktioniert als das Standardversprechen' .dann', also würde 'casper.then (function() {return someValue;}). Then (function (a) {}); Gut? –

+0

@Felix Nein, das ist derzeit nicht in CasperJS implementiert. Werte können nicht an nachfolgende Schritte weitergegeben werden. Der Rückgabewert vom ersten 'then' wird nur an 'casper.options.onStepComplete' übergeben und das' a', das an das zweite 'then' übergeben wird, ist die zuletzt geladene Seitenressource. –

Verwandte Themen