Javascript while循环的casperjs脚本中的异步进程

Javascript while循环的casperjs脚本中的异步进程,javascript,casperjs,Javascript,Casperjs,我使用while循环打开csv文件中的用户名列表。对于其中的每个用户名,我必须打开一个URL并将页面转储到一个文件中 但是,casper.thenOpen始终只运行一次。我从中了解到这是因为它是一个异步过程。我需要对下面的代码执行相同的操作: casper.then(function(){ stream = fs.open('usernames.csv', 'r'); targetusername = stream.readLine(); i = 0;

我使用while循环打开csv文件中的用户名列表。对于其中的每个用户名,我必须打开一个URL并将页面转储到一个文件中

但是,casper.thenOpen始终只运行一次。我从中了解到这是因为它是一个异步过程。我需要对下面的代码执行相同的操作:

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++;
    }

});
casper.thenOpen始终只运行一次,为我提供以下输出:

current url is first_url
current url is second_url
current url is third_url
I am here
我需要的是这样

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

我把头发拔出来是为了让线圈正常运转

我认为这段代码没有问题。我编写此代码是为了测试(基本上,它与您的代码相同):

如您所见,它打开了每个url


那么让我们来回答你的问题:

问题1:为什么它不输出为这样:

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:因为CasperJS首先分配步骤,更准确地说,将步骤推送到堆栈中,然后从该堆栈中弹出步骤,然后运行该步骤。更多信息,请看一看

问题2:为什么不输出为(为什么循环只运行1次):

A2:在打开第二个url时,您可能会遇到一些异常,PhantomJS崩溃。此代码可以帮助您查看发生了什么:

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

我可以达到我所需要的准确输出:

current url is first_url
I am here
current url is second_url
I am here
current url is third_url
I am here
使用重复功能,如下所示:

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');       
        });

    }

)});

碰撞有人吗?谢谢你的回复,但是你知道为什么我的代码会给出这样的输出吗??我甚至用for循环替换while循环,得到了相同的输出shown@SoCRaT正如我所说:
您在打开第二个url时可能会遇到一些异常,PhantomJS崩溃
,那么您是否尝试过我的代码来收集错误日志?与你的循环无关(
while
for
无所谓)。@SoCRaT你对我的答案还有问题吗?嗨,我可以使用repeat函数精确地解决它以产生我需要的结果。我马上就发。非常感谢你的帮助。
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
current url is first_url
I am here
current url is second_url
I am here
current url is third_url
I am here
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');       
        });

    }

)});