2013-07-31 4 views
0

У меня есть массив ссылок, и следующий код должен открыть каждую ссылку в массиве ссылок.then() метод только открывает ту же ссылку

var x; var i = 0; 

casper.start(URL, function() { 
    x = links.split(" "); // now x is an array of links 
}); 

casper.then(function() { 
    this.each(x, function() { 
     this.thenOpen((partialURL + x[i]), function() { 
      this.echo(this.getTitle()); // display the title of page 
      i++; // change the link being opened 
     }); 
    }); 
}); 

casper.run(); 

Проблема заключается в том, что он открывает первую ссылку и просто продолжает открывать эту ссылку снова и снова. Это как i не меняется.

Один из примеров CasperJS имел ту же проблему, что и для последователей Twitter, он откроет ссылку для каждого последователя Twitter, но будет отображать одно имя (последнее в списке) все время.

Вот пример:

var users = ['subelsky','bmorejs']; 
var casper = require('casper').create(); 

var idx,data,user; 
var length = users.length; 

casper.start(); 

for (idx=0; idx < length; idx++) { 
    user = users[idx]; 

    casper.thenOpen('http://mobile.twitter.com/' + user,function() { 
     data = this.evaluate(function(location) { 
      return document.querySelector('div.profile td.stat.stat-last div.statnum').innerText; 
     }); 
     this.echo(user + ": " + data); 
    }); 
} 

casper.run(); 

Выходной сигнал будет bmorejs: 2861 followers и bmorejs: 503 followers

Можно ли это изменить?

ответ

1

Кажется, что он проходит через все ссылки до того, как он попадает в функцию для thenOpen, и вместо этого просто открывает ссылки. Это простое решение.

Просто переместите свой оператор i++; над методом thenOpen, и таким образом он обязательно изменится, прежде чем откроет новую ссылку. Также измените начальное значение i на -1, так что, когда он запустится i++;, он не будет сразу пропустить 1.

Ваш код изменится на следующее:

var x; var i = -1;   

casper.start(URL, function() { 
    x = links.split(" "); // now x is an array of links 
}); 

casper.then(function() { 
    this.each(x, function() { 
     i++; // change the link being opened (has to be here specifically) 
     this.thenOpen((partialURL + x[i]), function() { 
      this.echo(this.getTitle()); // title should now be different 
     }); 
    }); 
}); 

casper.run(); 
Смежные вопросы