2014-10-31 1 views
1

이 코드는 dynamic.js 스크립트를 확장합니다. dynamic.js는 다음과 같이 실행됩니다. start, then, runrun 콜백은 동적 인 loop입니다. 괜찮아. 내 코드는 run 콜백의 끝에서 반복하고 싶지 않습니다. 중간에 루프를 만들고 싶어하므로 이후에 더 많은 코드를 실행할 수 있습니다. 따라서 start, then, loop, then, run입니다. 종료하기 전에 loop이 완료 될 때까지 casper이 완료 될 때까지 기다리지 않는 것 같습니다. 루프는 실행될 때마다 다른 지점에서 끝나고, 나는 결코 "after dynamic loop"이 울리는 것을 보지 못합니다. 다음은 몇 가지 샘플 출력 (그것은 일반적으로 어디서나 2 개 8 루프 사이에 끝납니다), 다음 코드는 다음과 같습니다동적 CasperJS 루프가 임의 반복으로 종료됩니다.

출력 :

start main 
start dynamic loop 
0 
Something. 
1 
Something. 
2 
Something. 
3 
Something. 
4 
Something. 
5 
Something. 

코드 :

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

var limit = 10; 
var i = 0; 

// dynamic loop 
var loop = function() { 
    if (i < limit) { 
     this.echo(i); 
     this.start("http://www.something.com", function() { 
      this.echo(this.evaluate(function() { return document.body.innerText; })); 
     }); 
     i++; 
     this.run(loop); 
    } else { 
     this.echo("dynamic loop done"); 
     this.exit(); 
    } 
} 

// main flow 
casper.start('http://www.something.com', function() { 
    this.echo("start main"); 
}); 

casper.then(function() { 
    casper.start().then(function() { 
     this.echo("start dynamic loop"); 
    }); 
    casper.run(loop); 
}); 

casper.then(function() { 
    this.echo("after dynamic loop"); 
}) 

casper.run(); 

답변

2

당신은 casper.start를 사용해야하고 casper.run 한 번만 스크립트에 입력하십시오. 그러나, 당신은 그들을 사용할 수 있습니다. 다른 제어 흐름에 중첩하면 "정의되지 않은"동작을 실행합니다.

// dynamic loop 
var loop = function() { 
    if (i < limit) { 
     this.echo(i); 
     i++; 
     this.thenOpen("http://www.something.com", function() { 
      this.echo(this.evaluate(function() { return document.body.innerText; })); 
     }); 
     this.then(loop); 
    } else { 
     this.echo("dynamic loop done"); 
    } 
} 

// main flow 
casper.start('http://www.something.com', function() { 
    this.echo("start main"); 
}); 

casper.then(loop); 

casper.then(function() { 
    this.echo("after dynamic loop"); 
}) 

casper.run(); 

당신은 하나의 스크립트에서 여러 casper 인스턴스를 가질 수 있지만, 당신은 어떻게 든 동기화 할 필요가있을 것이다 : 나는 casper.startcasper.run에 대한 대체 casper.thenOpencasper.then를 사용하는 것이 가장 좋은 방법입니다 찾을 수 있습니다.

스크립트가 리팩터링하지 않고도 약간의 수정이 필요할 수 있습니다. 루프에서 this.exit();을 제거하기 만하면됩니다. 조기에 퇴장합니다. 그러나 나는 여전히 당신이 당신의 스크립트를 리팩터링 할 것을 강력하게 제안한다.

+0

이는 의미가 있습니다. 여기에서 배운 교훈은 페이지 결과에 따라 Casperjs를 동적으로 만들고 싶다면'run'이 끝난 후에 콜백을 사용해야한다는 것입니다. 내 예제 코드는 그것을 보여주지 않지만 그게 내 목표 다. 언뜻보기에 dynamic.js 코드는 중첩 된 '시작'처럼 보이지만 콜백 일뿐입니다. 당신의 도움을 주셔서 감사합니다. – MattDiamant

+1

'casper.run'이 완료되면 스크립트가 종료됩니다. 당신이 CasperJS 제어 흐름을 벗어나면 흐름의 붕괴와 나란히 기다려야합니다. 이것은 일반적으로 필요하지 않습니다. Btw, ** dynamic.js **는 무엇입니까? 웹에서 찾은 스크립트 또는 작성한 스크립트입니까? –

+0

캐스퍼와 함께 제공되는 샘플 스크립트 폴더의 스크립트입니다. – MattDiamant