2016-06-01 12 views
1

Ich verwende eine While-Schleife, um eine Liste von Benutzernamen aus einer CSV-Datei zu öffnen. Für jeden Benutzernamen muss ich eine URL öffnen und die Seite in eine Datei ablegen.Asynchroner Prozess in einem Casperjs-Skript für die While-Schleife

Allerdings läuft dann casper.thenOpen immer nur einmal. Ich habe aus Asynchronous Process inside a javascript for loop verstanden, dass dies darauf zurückzuführen ist, dass es sich um einen asynchronen Prozess handelt. Ich brauche unten das gleiche für meinen Code zu tun:

casper.then(function(){ 
    stream = fs.open('usernames.csv', 'r'); 
    targetusername = stream.readLine();   
    i = 0; 

    while(targetusername) {     
     var url = "http://blablalb" + targetusername;  
     console.log("current url is " + url); 

     casper.thenOpen(url, function() { 
      console.log ("I am here"); 
      fs.write(targetusername,this.getTitle() + "\n",'w');   
      fs.write(targetusername,this.page.plainText,'a');  
     }); 

     targetusername = stream.readLine(); 
     i++; 
    } 

}); 

Die casper.thenOpen läuft immer nur eine Zeit, mir diese Ausgabe zu geben:

current url is first_url 
current url is second_url 
current url is third_url 
I am here 

Was ich brauche, ist wie folgt

current url is first_url 
I am here 
current url is second_url 
I am here 
current url is third_url 
I am here 

Ich ziehe mir die Haare aus, damit die while-Schleife richtig läuft!

+0

stoßen! Irgendjemand da draußen? – SoCRaT

Antwort

0

Ich konnte die genaue Ausgang erreichen, die ich brauchte:

current url is first_url 
I am here 
current url is second_url 
I am here 
current url is third_url 
I am here 

die Repeat-Funktion wie folgt verwendet:

casper.then(function(){ 
    stream = fs.open('usernames.csv', 'r');   

    casper.repeat(3, function() { 

     targetusername = stream.readLine(); 
     var url = "http://blablalb" + targetusername;  
     console.log("current url is " + url); 

     casper.thenOpen(url, function() { 
      console.log ("I am here"); 
      fs.write(targetusername,this.getTitle() + "\n",'w');   
      fs.write(targetusername,this.page.plainText,'a');  
     }); 

    } 

)}); 
2

Ich denke, dass mit diesem Code nichts falsch ist. Ich schreibe diesen Code für den Test (im Grunde, es ist das gleiche wie Ihr Code ist):

var casper = require('casper').create(); 

var url_list = [ 
    'http://phantomjs.org/', 
    'https://github.com/', 
    'https://nodejs.org/' 
] 

casper.start() 

casper.then(function() { 
     for (var i = 0; i < url_list.length; i++) { 
      casper.echo('assign a then step for ' + url_list[i]) 
      casper.thenOpen(url_list[i], function() { 
       casper.echo("current url is " + casper.getCurrentUrl()); 
      }) 
     } 
    } 
) 

casper.run() 

Ausgang:

assign a then step for http://phantomjs.org/ 
assign a then step for https://github.com/ 
assign a then step for https://nodejs.org/ 
current url is http://phantomjs.org/ 
current url is https://github.com/ 
current url is https://nodejs.org/en/ 

Wie Sie sehen, ist es jede URL geöffnet.


Also lassen Sie uns Ihre Fragen beantworten:

Q1: warum es keine Ausgabe wie folgt aus:

current url is first_url 
I am here 
current url is second_url 
I am here 
current url is third_url 
I am here 

A1: Da CasperJS Schritte zuerst zuweisen, genauer gesagt, schieben Schritte ein Stapel und dann Schritt aus diesem Stapel, dann führen Sie diesen Schritt. Werfen Sie einen Blick auf diese great answer für weitere Informationen.

Q2: Warum es nicht ausgibt als (warum die Schleife laufen nur 1mal):

current url is first_url 
current url is second_url 
current url is third_url 
I am here 
I am here 
I am here 

A2: Sie einige Ausnahmen bei der Eröffnung zweite URL und PhantomJS Abstürze treffen kann. Dieser Code kann Ihnen helfen, zu sehen, was passiert:

var casper = require('casper').create({ 
    verbose: true, 
    logLevel: "debug", 
}); //see more logs 

casper.on('error', function (msg, backtrace) { 
    var msgStack = ['PHANTOM ERROR: ' + msg]; 
    if (backtrace && backtrace.length) { 
     msgStack.push('TRACE:'); 
     backtrace.forEach(function(t) { 
      msgStack.push(' -> ' + (t.file || t.sourceURL) + ': ' + t.line + (t.function ? ' (in function ' + t.function +')' : '')); 
     }); 
    } 
    this.log(msgStack.join('\n'), "error"); 
});// watch the error event which PhantomJS emits 
+0

Vielen Dank für Ihre Antwort, aber haben Sie eine Idee, warum mein Code diese Ausgabe gibt? Ich ersetze sogar die while-Schleife durch eine for-Schleife und die gleiche Ausgabe wurde gezeigt – SoCRaT

+0

@SoCRaT Wie gesagt: 'Sie können einige Ausnahmen beim Öffnen der zweiten URL und PhantomJS Abstürze treffen, also haben Sie meinen Code zum Sammeln meiner Fehlerprotokolle versucht? Es hat nichts mit Ihren Loops zu tun ('while' oder' for' ist nicht wichtig). – Sayakiss

+0

@SoCRaT Hast du immer noch Probleme mit meiner Antwort? – Sayakiss